WPF: DataTrigger und MultiDataTrigger

Wenn Sie ein Abonnement des Magazins 'DATENBANKENTWICKLER' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

WPF: DataTrigger und MultiDataTrigger

Um die Eigenschaftswerte von Steuerelementen abhängig von den Werten anderer Steuer­elemente oder auch von Eigenschaften einzustellen, verwenden Sie Data­Trigger oder MultiDataTrigger. Wir schauen uns in diesem Artikel die Grundlagen zu diesen Elementen an und zeigen anhand einiger Beispiele, was beim Praxis­ein­satz zu beachten ist. Dabei betrachten wir auch, wie Sie DataTrigger auf Basis von Eigenschaften im Code behind-Modul des WPF-Objekts verwenden können.

Eigenschaften per VB einstellen

Wer von Access kommt, kennt nur zwei Methoden, um die Eigenschaften eines Steuerelements einzustellen: über das Eigenschaftsfenster oder per VBA. Beide Methoden sind beliebig miteinander kombinierbar. Sie können einen initialen Wert über das Eigenschaftsfenster einstellen oder dies per VBA erledigen, etwa in der Ereignisprozedur Form_Load des Formulars. Nachträgliche Einstellungen sind allerdings nur per VBA möglich.

Unter WPF/VB gibt es umfangreichere Möglichkeiten. Sie können eine Eigenschaft natürlich explizit im WPF-Code eines Elements festlegen – um etwa ein Steuer­element gleich beim Anzeigen des Fensters zu deaktivieren, stellen Sie die Eigenschaft einfach wie folgt ein (siehe Fenster EigenschaftPerWPF.xaml):

<Button x:Name="btnBeimAnzeigenDeaktiviert" ... IsEnabled="False" />

Sie können dem Fenster dann zwei Schaltflächen hinzufügen, mit deren Ereignismethoden für das Attribut Click die Eigenschaft IsEnabled auf True oder False eingestellt wird:

Private Sub btnAktivieren_Click(sender As Object, e As RoutedEventArgs)
     btnBeimAnzeigenDeaktiviert.IsEnabled = True
End Sub
Private Sub btnDeaktivieren_Click(sender As Object, e As RoutedEventArgs)
     btnBeimAnzeigenDeaktiviert.IsEnabled = False
End Sub

Das Ergebnis sieht dann wie in Bild 1 aus.

Aktivieren und deaktivieren per Schaltfläche und VB-Prozedur

Bild 1: Aktivieren und deaktivieren per Schaltfläche und VB-Prozedur

Die nächste Möglichkeit ist, diese Eigenschaft an eine öffentliche Eigenschaft im Code behind-Modul zu koppeln.

Eigenschaft an Code behind-Eigenschaft koppeln

Sie können die Eigenschaft IsEnabled auch an eine öffentlich deklarierte Eigenschaft im Code behind-Modul koppeln (siehe Fenster EigenschaftPerCodeBehind.xaml). Man könnte naiverweise meinen, dass folgender Code im Code behind-Modul ausreicht:

Public Property Aktiviert As Boolean
Private Sub btnAktivieren_Click(sender As Object, e As RoutedEventArgs)
     Aktiviert = True
End Sub
Private Sub btnDeaktivieren_Click(sender As Object, e As RoutedEventArgs)
     Aktiviert = False
End Sub

Dabei wollen wir voraussetzen, dass die Schaltfläche über die Eigenschaft IsEnabled an die Eigenschaft Aktiviert gebunden ist:

<Button x:Name="btnBeimAnzeigenDeaktiviert" Content="Beim Anzeigen deaktiviert" IsEnabled="{Binding Aktiviert}" ... />

Das reicht allerdings nicht aus, denn beim Anklicken der beiden Schaltflächen btnAktivieren und btnDeaktivieren geschieht nichts. Das ändert sich auch nicht, wenn wir die Schnittstelle INotifyPropertyChanged implementieren, die notwendig ist, um Aktualisierungen von Eigenschaften über die Bindung in die Benutzeroberfläche zu übertragen. Zusätzlich benötigen wir nämlich auch noch eine Konstruktor-Methode, die beim Erstellen des Fensters aufgerufen wird und dem WPF-Fenster mitteilt, dass es an die Eigenschaften des Code behind-Moduls gebunden werden soll. Insgesamt sieht der Code für das Code behind-Modul nun wie folgt aus. Als Erstes fügen wir einen Verweis auf den Namespace System.ComponentModel hinzu, den wir für die INotifyPropertyChanged-Schnittstelle benötigen:

Imports System.ComponentModel

Dann fügen wir die Implements-Anweisung zur Implementierung der Schnittstelle hinzu sowie die Eigenschaft Aktiviert, in der wir die Schnittstelle nutzen wollen:

Public Class EigenschaftPerCodeBehind
     Implements INotifyPropertyChanged
     Private _Aktiviert As Boolean
     Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
     Public Property Aktiviert As Boolean
         Get
             Return _Aktiviert
         End Get
         Set
             _Aktiviert = Value
             RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Aktiviert"))
         End Set
     End Property

Fehlt noch die Konstruktor-Anweisung, in der wir mit DataContext = Me angeben, dass die öffentlichen Eigenschaften des Code behind-Moduls vom XAML-Code aus gebunden werden können:

     Public Sub New()
         InitializeComponent()
         DataContext = Me
         Aktiviert = False
     End Sub
End Class

Das allein reicht allerdings noch nicht aus. Wir müssen auch noch die Eigenschaft IsEnabled="{Binding Aktiviert}" ersetzen, denn für die Bindung an eine Eigenschaft einer anderen Klasse ist ein DataTrigger nötig. Diesen hinterlegen wir wie folgt für die Schaltfläche btnAktivierenDeaktivieren:

<Button x:Name="btnAktivierenDeaktivieren" Content="Aktivieren/Deaktivieren" HorizontalAlignment="Left" Height="38" Margin="28,22,0,0" VerticalAlignment="Top" Width="180">
     <Button.Style>
         <Style TargetType="{x:Type Button}">
             <Setter Property="IsEnabled" Value="False"></Setter>
             <Style.Triggers>
                 <DataTrigger Binding="{Binding Aktiviert}" Value="True">
                     <Setter Property="IsEnabled" Value="True" />
                 </DataTrigger>
             </Style.Triggers>
         </Style>
     </Button.Style>
</Button>

Hier sind gleich mehrere wichtige Informationen untergebracht:

  • Mit dem ersten Setter-Element legen wir für die Eigenschaft IsEnabled den Wert False als initialen Wert fest. Das ist die Methode, den Standardwert zu definieren, wenn Sie einen DataTrigger verwenden.
  • Im DataTrigger-Element definieren wir, welchen Wert wir untersuchen wollen, hier die gebundene Eigenschaft Aktiviert für das Attribut Property, und mit welchem Wert wir den gelieferten Wert vergleichen wollen – hier True für das Attribut Value. Ist diese Bedingung erfüllt, also ist der Wert der Eigenschaft Aktiviert gleich True, wird die im untergeordneten Setter-Element angegebene Eigenschaft mit dem dort angegebenen Wert gefüllt.

Achtung: Wenn Sie den Standardwert bei Verwendung eines DataTriggers mit WPF-Mitteln einstellen wollen, gelingt dies nur mit dem erwähnten Setter-Element – das Einstellen der Eigenschaft als Attribut des hier verwendeten Button-Elements ist nicht möglich (also etwa mit IsEnabled = False). Wenn Sie das dennoch tun, kann der Wert durch den DataTrigger nicht mehr geändert werden!

Mehrere Bedingungen verwenden

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.