如何为WPF中的数据触发提供多个条件?
如何为WPF中的数据触发提供多个条件?
使用MultiDataTriggertypes
<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>
@jasonk – 如果你想拥有“或”,那么否定自(A和B)<=>〜(〜A或〜B)
但如果你有其他值布尔尝试使用types转换器:
<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>
你可以用你喜欢的任何方式使用Convert方法中的值来产生适合你的条件。
要详细说明@ serine的答案,并说明使用非平凡的多值条件:我需要在布尔条件NOT a AND (b OR NOT c)
的项目上显示一个“暗淡”覆盖。
对于背景,这是一个“多选”问题。 如果用户select了错误的答案,它将被禁用 (变暗,不能再次select)。 自动代理人有能力专注于任何特定的select来给出解释(边框突出显示)。 当代理人重点关注某个项目时, 即使该项目被禁用 , 也不应将其变暗。 所有未聚焦的项目都被标记为不重点 ,应该变暗。
调光的逻辑是这样的:
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); } ... }
在XAML中,我在一个<Style><Style.Triggers>
资源的MultiDataTrigger
中使用它
<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>
为了完整起见,我的转换器是在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>