3 ответов:
использовать 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>
@jasonk-если вы хотите иметь "или", то отрицайте все условия, так как (A и B) ~(~A или ~B)
но если у вас есть значения, отличные от boolean попробуйте использовать преобразователи типов:
<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 любым способом, который вам нравится, чтобы создать условие, которое вам подходит.
разъяснить @Серин-х и проиллюстрировать работу с нетривиальным многозначным условием: мне нужно было показать наложение "затемнения" на элемент для булева условия
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); } ... }в 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>и для полноты картины, Мой конвертер определена в
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>
Comments