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 Steuerelemente oder auch von Eigenschaften einzustellen, verwenden Sie DataTrigger oder MultiDataTrigger. Wir schauen uns in diesem Artikel die Grundlagen zu diesen Elementen an und zeigen anhand einiger Beispiele, was beim Praxiseinsatz 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 Steuerelement 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.
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.