[WPF] DataTrigger

Dans un projet WPF il est possible d’agir sur les controls selon certaines conditions via le codebehind. Mais parfois, ou lorsque cela n’est pas possible, une solution existe pour le faire de puis le XAML : les DataTriggers.

Simple Condition

L’utilité des DataTriggers : Déclencher un comportement sur un élement XAML à partir de la valeur d’une donnée. Ils sont les enfants de la balise <Style> et se place donc dans l’arbre du style d’un control, plus spécifiquement dans son attribut « Triggers ».

<Style.Triggers> 
   <DataTrigger Binding="DataToCheck" Value="ValueLinked"> 
      <Setter Property="PropertyToModify" Value="Hidden" /> 
   </DataTrigger> 
</Style.Triggers>

Considérons un Button dont la visibilité changerait en fonction de la valeur d’une liste.

<Button Content="Add Value">
   <Button.Style>
      <Style TargetType="{x:Type Button}">
         <Setter Property="Visibility" Value="Visible" />
      </Style>
   </Button.Style>
</Button>

Dans l’arbre XAML est présent la propriété Visibility définie à Visible.

Toutefois, il se pourrait qu’à un moment la liste soit réinitialisée.
Il faudrait donc la masquer dans le cas où sa valeur deviendrait null.

> La propriété Visibility serait settée à Collapsed (ou Hidden) dans le cas où l’élément ObjectsList est null.

<Button Content="Add Value">
   <Button.Style>
      <Style TargetType="{x:Type Button}">
         <Setter Property="Visibility" Value="Visible" />
         <Style.Triggers> 
            <DataTrigger Binding="{Binding ObjectsList}" Value="{x:Null}"> 
               <Setter Property="Visibility" Value="Hidden" /> 
            </DataTrigger> 
         </Style.Triggers> 
      </Style>
   </Button.Style>
</Button>

De cette manière le Button serait par défaut visible, sauf si la source de donnée n’a pas été initialisée.

Dans le cas d’une ObjectsList déclenchant l’évènement PropertyChanged(), le bouton pourrait apparaître ou disparaître dynamiquement au cours de l’application.

Multi-Condition

Enfin, il est possible de gérer, uniquement via le XAML, la visibilité de notre bouton selon plusieurs conditions. C’est ce que permet la balise <MultiTrigger>.

Imaginons le cas où on décide d’afficher le bouton selon deux conditions : notre liste a bien été initialisée et le controleur de la vue a reçu l’authorisation de l’éditer.

<Style.Triggers>
   <MultiTrigger>
      <MultiTrigger.Conditions>
         <Condition Binding="{Binding ObjectsListInitialized}" Value="true">
         <Condition Binding="{Binding ModificationAuthorized}" Value="true">
      </MultiTrigger.Conditions>
      <MultiTrigger.Setters>
         <Setter Property="Visibility" Value="Visible" />
      </MultiTrigger.Setters>
   <MultiTrigger>       
</Style.Triggers>
Source
  • https://stackoverflow.com/questions/38152912/change-listviewitem-background-colour-on-mouse-over

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *