REMARQUE j'ai posé la question connexe: Comment combiner DataTrigger et EventTrigger?
J'ai une zone de liste contenant plusieurs éléments. L'élément de la classe implémente
INotifyPropertyChanged
et a une propriétéIsAvailable
. J'utilise cette propriété pour indiquer les options non disponibles dans la liste en utilisant une couleur différente.Toutefois, si l'élément sélectionné n'est pas disponible, alors le de premier plan doit être d'une couleur rouge.
<ListBox> <ListBox.Resources> <DataTemplate DataType="{x:Type local:InstitutionViewModel}"> <TextBlock Name="Name" Text="{Binding Name}"/> <DataTemplate.Triggers> <DataTrigger Binding="{Binding IsAvailable}" Value="False"> <Setter TargetName="Name" Property="Foreground" Value="#888"/> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </ListBox.Resources> </ListBox>
J'utilise les données ci-dessus déclencheur pour griser les articles indisponibles.
Le problème que je me pose, c'est que le fait que l'élément est sélectionné n'a rien à voir avec les données sous-jacentes à laquelle le modèle est lié. Ce que je veux vraiment, c'est une sorte de multi-déclencheur qui prend en charge un ordinaire
Trigger
sur une propriété de dépendance (ListBoxItem.IsSelected
) avec unDataTrigger
sur la borne de l'élément de données.Cela peut être fait sans l'introduction de la notion de sélection dans mon modèle de vue?
Pour quelqu'un qui se demandent pourquoi je ne désactivez pas les articles indisponibles, comprendre que c'est une exigence de l'application que les options non disponibles peuvent être sélectionnés. Il y a quelques zones de liste, et la sélection dans l'un des effets de ce qui est disponible dans les autres. Je ne peux pas désactiver les éléments que l'utilisateur ne serait pas en mesure de changer leurs esprits ou explorez les différentes combinaisons si les articles ont été désactivés basé sur les sélections.
Réponses
Trop de publicités?Pour tous ceux qui sont confrontés à ce problème, j'ai trouvé une solution qui fonctionne pour moi. Bien sûr, je suis toujours intéressé de voir d'autres réponses intéressantes.
Voici ce que j'ai fait:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding
RelativeSource={
RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}},
Path=IsSelected}" Value="True"/>
<Condition Binding="{Binding IsAvailable}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter TargetName="Name" Property="Foreground" Value="#F00"/>
</MultiDataTrigger>
Il n'y a rien de spécial à ce que ce soit un déclencheur multiple. Si vous souhaitez simplement styliser l'élément sélectionné différemment dans votre modèle de données, vous pouvez utiliser:
<DataTrigger Binding="{Binding
RelativeSource={
RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}},
Path=IsSelected}" Value="True">
<Setter TargetName="Name" Property="Foreground" Value="#888"/>
</DataTrigger>
Vadim
Points
63