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


回答:


280

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>

28
multiTriggerで「OR」ステートメントを実行する方法はありますか?例:名前= "portland" OR状態= "OR"
jasonk

12
@jasonk-MultiTriggerでそれができるかどうかわからない。あなたはその...のために2つのトリガを定義することができます
Gishu

2
単純なOR条件ステートメントの場合は、論理を逆にしてANDにすることができます。|条件1 |条件2 | 結果| | true | true | 真| | true | false | 真| | false | true | 真| | false | false | false | / ORのどちらかがtrueかどうかをチェックする代わりに、/ ANDが両方ともfalseの場合にチェックし、デフォルトをtrueに設定します。
WeSam Abdallah 2014

3
@WeSamAbdallah条件が偽であるかどうかを確認することはできません。
ジムバルター2016年

4
単純なコンバーターでfalseである条件をチェックできます。
Paul

50

@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メソッドの値を任意の方法で使用して、自分に合った条件を作成できます。


3
ああ、すべてを否定してOR条件に
切り替える

8
この答えを少し詳しく説明していただけますか?使い方がわかりません。何をしconditionConverterますか?orこの例では、2つのオプションとして「ポートランド」と「OR」をどのように指定していますか?
DLeh 2014年

4
@ cod3monk3y、リンクが壊れています。
Spidermain50 2016

22

詳しく説明し@セリンの答えと非自明な複数値の状態で作業を示しています。私は、ブール条件の項目の「薄暗いアウト」のオーバーレイを表示する必要がありましたNOT a AND (b OR NOT c)

背景として、これは「複数選択」の質問です。ユーザーが間違った答えを選択すると、無効になります(淡色表示され、再度選択することはできません)。自動化されたエージェントは、特定の選択肢に焦点当てて説明を行うことができます(境界線が強調表示されています)。エージェントがアイテムに焦点を合わせている場合、無効になっている場合でも淡色表示にしないでください。集中していないすべての項目がマークされている焦点を当てDE- 、およびアウト淡色表示されなければなりません。

したがって、調光のロジックは次のとおりです。

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>

11
これは、コンバーターがこのように使用されることの意図ではないと思います。それらは実際に値を表示用に変換するためのものです。これが複雑になったら、ビューモデルに計算プロパティを作成して、必要なものを提供します。
Martin Capodici

13
でもそのネーミング
ケリーエルトン

13
プログラミングが巧妙で、コードが洗練されていたことを思い出してください。
ファジーロジック2017年

0




これはアニメーション専用です。ANDロジックを実装する場合は、MultiTriggerを使用する必要があります。

次に例を示します。プロパティText = ""(空の文字列)AND IsKeyboardFocused = "False"の場合にアクションを実行するとします。コードは次のようになります。

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="Text" Value="" />
        <Condition Property="IsKeyboardFocused" Value="False" />
    </MultiTrigger.Conditions>
        <MultiTrigger.EnterActions>
            <!-- Your actions here -->
        </MultiTrigger.EnterActions>
</MultiTrigger>

ORロジックを実装する場合、いくつかの方法があり、何をしようとするかによって異なります。

最初のオプションは、複数のトリガーを使用することです。
したがって、Text = "" OR IsKeyboardFocused = "False"のいずれかで何かしたい場合
、コードは次のようになります。

<Trigger Property="IsEnabled" Value="false">
    <Setter Property="Opacity" TargetName="border" Value="0.56"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
    <Setter Property="BorderBrush" TargetName="border" 
            Value="{StaticResource TextBox.MouseOver.Border}"/>
</Trigger>


しかし、これの問題は、Text IS N'T null または IsKeyboard = "True"のいずれかで何かしたい場合はどうすればよいですか?これは、2番目のアプローチで実現できます
。つまり、!(!x &&!y)= x ||であるドモーガンの規則を思い出してください。y。
したがって、Text = ""およびIsKeyboard = "True"のときにトリガーされるマルチトリガーを作成することにより、前の問題を解決するためにそれを使用し、次のようにEXIT ACTIONSでアクションを実行します。

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="Text" Value="" />
        <Condition Property="IsKeyboardFocused" Value="False" />
    </MultiTrigger.Conditions>
    <MultiTrigger.ExitActions>
        <!-- Do something here -->
    </MultiTrigger.ExitActions>
</MultiTrigger>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.