184

WPFでデータトリガーに複数の条件を提供するにはどうすればよいですか?

4

4 に答える 4

297

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>
于 2009-05-25T08:53:22.843 に答える
55

@jasonk - 「または」が必要な場合は、(A and B) <=> ~(~A or ~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 メソッドの値を任意の方法で使用して、自分に合った条件を生成できます。

于 2011-01-11T16:36:34.720 に答える
21

@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);
    }
    ...
}

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>
于 2015-02-19T18:13:03.367 に答える