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.

Neues aus unseren Magazinen
Listenfeld: Reihenfolge mehrerer Einträge...

Wir haben bereits in mehreren Beiträgen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle über den Inhalt eines Feldes etwa namens »ReihenfolgeID« einstellen können –... [mehr]

Diagramme mit gefilterten Daten

In Ausgabe 2/2019 haben wir in zwei Artikeln die modernen Diagramme von Access vorgestellt. Im vorliegenen Beitrag zeigen wir Ihnen, wie Sie diese abhängig von den in einem Formular angezeigten... [mehr]

Benutzerverwaltung mit verschlüsselten...

Wenn Sie in einer Access-Anwendung Benutzer verwalten wollen, die sich per Benutzername und Kennwort an die Anwendung anmelden, sollten Sie sehr sensibel mit den in der Anwendung gespeicherten... [mehr]

HTML-Tabellen mit fester Kopfzeile

In den vorherigen Ausgaben von Access im Unternehmen und in der aktuellen Ausgabe arbeiten wir in einigen Beiträgen mit dem Webbrowser-Steuerelement und stellen Daten, die wir mit den Bordmitteln... [mehr]

Flexible HTML-Tabellen mit fester Kopfzeile

Im Beitrag »HTML-Tabellen mit fester Kopfzeile« haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenköpfe oben fixiert... [mehr]

Berechtigungen per HTML verwalten

Im Beitrag »Benutzerverwaltung mit verschlüsselten Kennwörtern« stellen wir eine Lösung vor, in der wir die Berechtigungen von Benutzergruppen an Datenbankobjekten definieren. Dort benötigen wir... [mehr]

Benutzer und Berechtigungen ermitteln

In den Beiträgen »Benutzerverwaltung mit verschlüsselten Kennwörtern« und »Berechtigungen per HTML verwalten« haben wir die Voraussetzungen für eine Benutzerverwaltung geschaffen. Im vorliegenden... [mehr]

Zugriffsrechte mit Datenmakros

Es gibt verschiedene Möglichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die für ihn vorgesehenen Aktionen mit Daten durchführen darf – beispielsweise durch... [mehr]

Kennwörter generieren

Für den einen oder anderen Zweck möchten Sie vielleicht Kennwörter generieren oder in einer Benutzeroberfläche die Möglichkeit zum Generieren von Kennwörtern anbieten. Wenn Sie etwa Benutzer zu... [mehr]

Neuer Datensatz von Frontend zu Backend

Für manche Themen gibt es keine kurze, prägnante Überschrift. In diesem Fall wollen wir zeigen, wie Sie einen neuen Datensatz anlegen, der in einer temporären Tabelle im Frontend gespeichert wird,... [mehr]