【问题标题】:UWP Equivalent of MultiDataTrigger in WPFWPF 中 MultiDataTrigger 的 UWP 等效项
【发布时间】:2019-03-19 10:03:47
【问题描述】:

我希望我的 Button 仅在我的 CheckBox 都被选中时才启用。但是这段代码不起作用。按钮始终处于启用状态。
我认为 WPF 中的 MultiDataTrigger 可以做到这一点,但在 UWP 中我没有 MultiDataTrigger

<CheckBox x:Name="Condition1">
<CheckBox x:Name="Condition2">

<Button x:Name="LoginBtn" Click="LoginBtn_Click" Content="Login">
    <Interactivity:Interaction.Behaviors>
        <Core:DataTriggerBehavior Binding="{Binding ElementName=Condition1, Path=IsChecked}" Value="False">
            <Core:ChangePropertyAction TargetObject="{Binding LoginBtn}" PropertyName="IsEnabled" Value="False"/>
        </Core:DataTriggerBehavior>
        <Core:DataTriggerBehavior Binding="{Binding ElementName=Condition2, Path=IsChecked}" Value="False">
            <Core:ChangePropertyAction TargetObject="{Binding LoginBtn}" PropertyName="IsEnabled" Value="False"/>
        </Core:DataTriggerBehavior>
        <Core:DataTriggerBehavior Binding="{Binding ElementName=LoginBtn, Path=IsEnabled}" Value="False">
            <Core:ChangePropertyAction PropertyName="Background" Value="Gray"/>
        </Core:DataTriggerBehavior>
    </Interactivity:Interaction.Behaviors>
</Button>

【问题讨论】:

    标签: xaml uwp


    【解决方案1】:

    如果您使用的是 MVVM,您可以使用 CanExecute 来启用和禁用按钮

    【讨论】:

      【解决方案2】:

      问题是DataTriggerBehavior不像WPF中的DataTrigger,如果不满足条件,它不会将目标属性恢复为默认值。

      所以,我终于找到了一种程序化的方法。

      private bool? condition1
      {
          get { return Condition1.IsChecked; }
          set
          {
              Condition1.IsChecked = value;
              if ((value ?? false) && (condition2 ?? false)) LoginBtn.IsEnabled = true;
              else LoginBtn.IsEnabled = false;
          }
      }
      private bool? condition2
      {
          get { return Condition2.IsChecked; }
          set
          {
              Condition2.IsChecked = value;
              if ((value ?? false) && (condition1 ?? false)) LoginBtn.IsEnabled = true;
              else LoginBtn.IsEnabled = false;
          }
      }
      

      XAML:

      <CheckBox x:Name="Condition1" IsChecked="{x:Bind condition1, Mode=TwoWay}"/>
      <CheckBox x:Name="Condition2" IsChecked="{x:Bind condition1, Mode=TwoWay}"/>
      

      按钮颜色

      <Core:DataTriggerBehavior Binding="{Binding ElementName=LoginBtn, Path=IsEnabled}" Value="False">
          <Core:ChangePropertyAction PropertyName="Background" Value="Gray"/>
      </Core:DataTriggerBehavior>
      <Core:DataTriggerBehavior Binding="{Binding ElementName=LoginBtn, Path=IsEnabled}" Value="True">
          <Core:ChangePropertyAction PropertyName="Background" Value="White"/>
      </Core:DataTriggerBehavior>
      

      同时设置按钮默认IsEnable=False

      我认为这可以通过 CompositeStateTrigger 在 vsm 中实现。
      期待更好的解决方案!

      【讨论】:

        猜你喜欢
        • 2020-08-31
        • 1970-01-01
        • 1970-01-01
        • 2018-01-29
        • 2010-10-27
        • 1970-01-01
        • 2016-01-07
        • 1970-01-01
        • 2015-11-06
        相关资源
        最近更新 更多