Как я могу предоставить несколько условий для запуска данных в WPF? - PullRequest
161 голосов
/ 25 мая 2009

Как я могу предоставить несколько условий для запуска данных в WPF?

Ответы [ 3 ]

265 голосов
/ 25 мая 2009

Использование 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>
46 голосов
/ 11 января 2011

@ 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>

вы можете использовать значения в методе Convert любым способом, чтобы создать условие, которое вам подходит.

20 голосов
/ 19 февраля 2015

Чтобы уточнить @ ответ серина и проиллюстрировать работу с нетривиальным многозначным условием: мне нужно было показать наложение «затемнения» на элемент для логического условия 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>
...