回答:
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)以降のすべての条件を否定します。
ただし、ブール値以外の値がある場合は、型コンバーターを使用してみてください。
<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メソッドの値を任意の方法で使用して、自分に合った条件を作成できます。
conditionConverter
ますか?or
この例では、2つのオプションとして「ポートランド」と「OR」をどのように指定していますか?
詳しく説明し@セリンの答えと非自明な複数値の状態で作業を示しています。私は、ブール条件の項目の「薄暗いアウト」のオーバーレイを表示する必要がありました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>
これはアニメーション専用です。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>