如何为WPF中的数据触发提供多个条件?

Sum*_*esh 167 wpf datatrigger

如何为WPF中的数据触发提供多个条件?

Gis*_*shu 277

使用MultiDataTrigger类型

<Style TargetType="ListBoxItem">
    <Style.Triggers>
      <DataTrigger Binding="{Binding Path=State}" Value="WA">
        <Setter Property="Foreground" Value="Red" />
      </DataTrigger>    
      <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
          <Condition Binding="{Binding Path=Name}" Value="Portland" />
          <Condition Binding="{Binding Path=State}" Value="OR" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Background" Value="Cyan" />
      </MultiDataTrigger>
    </Style.Triggers>
  </Style>
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法在multiTrigger中执行"OR"语句.例如name ="portland"或state ="OR" (24认同)
  • @jasonk - 不确定你是否可以用MultiTrigger做到这一点.你可以为它定义两个触发器.. (11认同)
  • 您可以通过简单的转换器检查条件是否为假. (3认同)
  • 如果它是一个简单的 OR 条件语句,您可以颠倒逻辑,使其变成 AND。|条件 1 |条件 2 | 结果| |真 |真 | 真实| |真 |假 | 真实| |假 |真 | 真实| |假 |假 | 假| 与其检查其中一个/OR 是否为真,不如检查两个/AND 何时为假,并将默认值设置为真。 (2认同)
  • @WeSamAbdallah您无法检查条件是否错误. (2认同)
  • @Paul &lt;Condition Value="False"&gt; 怎么样? (2认同)

ser*_*ine 46

@jasonk - 如果你想要"或"然后否定所有条件,因为(A和B)<=>〜(~A或~B)

但如果你有布尔值以外的值尝试使用类型转换器:

<MultiDataTrigger.Conditions>
    <Condition Value="True">
        <Condition.Binding>
            <MultiBinding Converter="{StaticResource conditionConverter}">
                <Binding Path="Name" />
                <Binding Path="State" />
            </MultiBinding>
        </Condition.Binding>
        <Setter Property="Background" Value="Cyan" />
    </Condition>
</MultiDataTrigger.Conditions>
Run Code Online (Sandbox Code Playgroud)

您可以以任何方式使用Convert方法中的值来生成适合您的条件.

  • 你能否稍微扩展一下这个答案?我不确定如何使用它.`conditionConverter`做什么?在这个例子中,我们如何指定"Portland"和"OR"作为我们的两个`或`选项? (6认同)
  • 啊,否定一切并将其翻转为 OR 条件的明智之举:) (3认同)
  • @ cod3monk3y,你的链接坏了. (2认同)

cod*_*k3y 20

详细说明@ serine的答案并说明使用非平凡的多值条件:我需要在项目上显示布尔条件的"暗淡"覆盖NOT a AND (b OR NOT c).

对于背景,这是一个"多选"问题.如果用户选择了错误的答案,它将被禁用(变暗并且无法再次选择).自动代理能够专注于任何特定选择以提供解释(突出显示边框).当代理关注某个项目时,即使它被禁用,也不应该变暗.所有未聚焦的项目都标记为非聚焦,应该变暗.

因此,调光的逻辑是:

NOT IsFocused AND (IsDefocused OR NOT Enabled)

为了实现这个逻辑,我制作了一个IMultiValueConverter名为(笨拙)的通用符合我的逻辑

// 'P' represents a parenthesis
//     !  a &&  ( b ||  !  c )
class NOT_a_AND_P_b_OR_NOT_c_P : IMultiValueConverter
{
    // redacted [...] for brevity
    public object Convert(object[] values, ...)
    {
        bool a = System.Convert.ToBoolean(values[0]);
        bool b = System.Convert.ToBoolean(values[1]);
        bool c = System.Convert.ToBoolean(values[2]);

        return !a && (b || !c);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

在XAML中,我MultiDataTrigger<Style><Style.Triggers>资源中使用它

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <!-- when the equation is TRUE ... -->
        <Condition Value="True">
            <Condition.Binding>
                <MultiBinding Converter="{StaticResource NOT_a_AND_P_b_OR_NOT_c_P}">
                    <!-- NOT IsFocus AND ( IsDefocused OR NOT Enabled ) -->
                    <Binding Path="IsFocus"/>
                    <Binding Path="IsDefocused" />
                    <Binding Path="Enabled" />
                </MultiBinding>
            </Condition.Binding>
        </Condition>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
        <!-- ... show the 'dim-out' overlay -->
        <Setter Property="Visibility" Value="Visible" />
    </MultiDataTrigger.Setters>
</MultiDataTrigger>
Run Code Online (Sandbox Code Playgroud)

为了完整起见,我的转换器定义为 ResourceDictionary

<ResourceDictionary xmlns:conv="clr-namespace:My.Converters" ...>
    <conv:NOT_a_AND_P_b_OR_NOT_c_P x:Key="NOT_a_AND_P_b_OR_NOT_c_P" />
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

  • 我认为这不是以这种方式使用转换器的意图.它们实际上是用于转换显示值.当它变得复杂时,只需在视图模型上创建一个计算属性,为您提供所需的属性. (8认同)
  • 那个命名虽然 (7认同)
  • 请花一点时间保持沉默,以便记住编程是一种工艺,代码是优雅的. (6认同)