Comment puis-je fournir plusieurs conditions pour le déclenchement de données dans WPF?
Utilisez MultiDataTrigger type
<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 - si vous voulez avoir "ou" alors annulez toutes les conditions depuis (A et B) <=> ~ (~ A ou ~ B)
mais si vous avez des valeurs autres que boolean, essayez d'utiliser des convertisseurs de type:
<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>
vous pouvez utiliser les valeurs de la méthode Convert comme bon vous semble pour produire une condition qui vous convient.
Pour élaborer réponse de @ serine et illustrer le travail avec une condition multivariée non triviale: J'avais besoin de montrer une superposition "atténuée" sur un élément pour la condition booléenne NOT a AND (b OR NOT c)
.
Pour l’arrière-plan, il s’agit d’une question à choix multiple. Si l'utilisateur choisit une mauvaise réponse, il devient désactivé (estompé et ne peut pas être sélectionné à nouveau). Un agent automatisé a la capacité de se concentrer sur un choix particulier pour donner une explication (bordure mise en surbrillance). Lorsque l'agent se concentre sur un élément, celui-ci ne doit pas être estompé même s'il est désactivé. Tous les éléments non focalisés sont marqués non focalisés et doivent être estompés.
La logique de gradation est donc:
NOT IsFocused AND (IsDefocused OR NOT Enabled)
Pour implémenter cette logique, j'ai créé un IMultiValueConverter
générique nommé (maladroitement) correspondant à ma logique
// '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);
}
...
}
Dans le XAML, je l’utilise dans un MultiDataTrigger
dans un <Style><Style.Triggers>
Ressource
<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>
Et pour être complet, mon convertisseur est défini dans un 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>