Trigger in Datenvorlagen

Häufig möchten Sie in einer Datenvorlage das Aussehen eines Elements der Benutzerschnittstelle je nach dem Wert der Daten ändern. In einer Aufgabenliste könnte es zum Beispiel erforderlich sein, den Wert der Priorität fett darzustellen, wenn dieser den Wert »1« annimmt.

Datenvorlage mit Trigger-Elementen

<Window x:Class="DataTemplateTrigger.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:code="clr-namespace:DataTemplateTrigger"    
        Title="MainWindow" Height="300" Width="300">
  <Window.Resources>
    <code:Tasks x:Key="data" />

    <DataTemplate DataType="{x:Type code:Task}">
      <StackPanel>
        <TextBlock Name="Title" Foreground="Red" FontWeight="Bold" FontSize="18" 
                   Text="{Binding Path=TaskName}" />
        <TextBlock Background="LightGray" FontStyle="Italic"
                   Text="{Binding Path=Description}" />
        <StackPanel Orientation="Horizontal">
          <TextBlock Text="Priorität: " />
          <TextBlock Name="Prio" FontWeight="Bold" Text="{Binding Path=Priority}" />
        </StackPanel>
      </StackPanel>

      <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=Priority}" Value="1">
          <Setter TargetName="Prio" Property="FontStyle" Value="Italic" />
          <Setter TargetName="Prio" Property="Foreground" Value="Green" />
          <Setter TargetName="Prio" Property="FontSize" Value="16" />
        </DataTrigger>

        <DataTrigger Binding="{Binding Path=TaskType}">
          <DataTrigger.Value>
            <code:TaskType>Home</code:TaskType>
          </DataTrigger.Value>
          <Setter TargetName="Title" Property="FontSize" Value="26" />
        </DataTrigger>
      </DataTemplate.Triggers>
    </DataTemplate>
  </Window.Resources>

  <Grid>
    <DockPanel>
      <TextBlock DockPanel.Dock="Top" FontSize="20" Text="Tasklist:" />

      <ListBox DockPanel.Dock="Top" SelectionChanged="lb_SelectionChanged" Name="lb"
               ItemsSource="{Binding Source={StaticResource data}}" />
    </DockPanel>
  </Grid>
</Window>

Da sich die Setter-Elemente in den Triggern auf Elemente in der Benutzerschnittstelle der Datenvorlage beziehen, müssen genau diese Steuerelemente, die von einem Setter verändert werden sollen, mit einem Namen versehen werden. Im Beispiel sind dies die beiden TextBlock-Elemente, welche an die Eigenschaften TaskName und Priority aus der Logikklasse gebunden sind.

Bei jedem DataTrigger wird über die Eigenschaft Value definiert, wann er »auslösen« soll und die im Trigger deklarieren Setter-Elemente ausführen soll. Bei der Angabe eines Werts für die Eigenschaft TaskType wird auf die Aufzählung im C#-Code zugegriffen. Hier muss für die Value-Eigenschaft die Full Node-Schreibweise benutzt werden:

<DataTrigger.Value>
  <code:TaskType>Home</code:TaskType>
</DataTrigger.Value>

Die Setter-Elemente im jeweiligen DataTrigger werden nur dann angewendet, wenn der Wert der Value-Eigenschaft dem entsprechenden Datenwert entspricht. Sobald die beiden Werte ungleich sind, werden die Setter nicht mehr ausgeführt und dadurch erscheint das ursprüngliche Aussehen der Benutzerschnittstelle. Wenn in der Datenklasse die Schnittstelle INotifyPropertyChanged implementiert ist, werden auch Änderungen der Daten zur Laufzeit der Anwendung entsprechend über die Datenbindung dargestellt.

DataTemplateTrigger.zip