Question

  

REMARQUE J'ai posé la question correspondante: Comment combiner DataTrigger et EventTrigger?

J'ai une liste déroulante contenant plusieurs éléments. La classe de l'élément implémente INotifyPropertyChanged et possède une propriété IsAvailable . J'utilise cette propriété pour indiquer des options indisponibles dans la liste en utilisant une couleur différente.

Cependant, si un élément sélectionné n'est pas disponible, la couleur de premier plan doit être 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 le déclencheur de données ci-dessus pour estomper les éléments non disponibles.

Le problème auquel je suis confronté est que le fait que l'élément soit sélectionné n'a rien à voir avec les données sous-jacentes auxquelles le modèle est lié. Ce que je veux vraiment, c'est une sorte de multi-déclencheur qui prend en charge un déclencheur Trigger standard sur une propriété de dépendance ( ListBoxItem.IsSelected ) ainsi qu'un DataTrigger sur la donnée liée.

Cela peut-il être fait sans introduire le concept de sélection dans mon modèle de vue?

Si vous vous demandez pourquoi je ne désactive pas les éléments non disponibles, sachez que les options non disponibles doivent obligatoirement être sélectionnées. Il y a en fait quelques listes de sélection et la sélection dans un effet sur ce qui est disponible dans les autres. Je ne peux pas désactiver les éléments, car l'utilisateur ne serait pas en mesure de changer d'avis ou d'explorer différentes combinaisons si les éléments étaient désactivés en fonction de sélections antérieures.

Était-ce utile?

La solution

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>

Cependant, il n’ya rien de particulier à ce qu’il s’agisse d’un déclencheur multiple. Si vous souhaitez simplement styler différemment l'élément sélectionné 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>

Autres conseils

Pour l'utiliser avec DataGridRow , modifiez le mode de liaison en Self :

Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=... 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top