Abhängige Eigenschaften per Binding

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.

Abhängige Eigenschaften per Binding

Im Artikel Trigger haben Sie erfahren, dass Sie Eigenschaften von Elementen abhängig von der Änderung anderer Eigenschaften ebenfalls ändern können. Dies gelingt, mitunter über kleine Umwege, auch mithilfe von Bindungen zwischen den Steuerelementen. So können Sie beispielsweise ganz einfach definieren, dass eine Eigenschaft den Wert True erhält, wenn eine Eigenschaft eines anderen Elements auch diese Eigenschaft annimmt. Soll hingegen der Wert False übernommen werden, wenn die andere Eigenschaft True lautet, wird es kompliziert – dann kommt ein Converter ins Spiel. Dieser Artikel zeigt die Möglichkeiten für den Ersatz von Triggern durch Binding auf.

Beispielprojekt

Wir verwenden hier wieder das Beispiel, das auch im Artikel Trigger zum Einsatz kam: Wir wollen also in Abhängigkeit des Zustands eines CheckBox-Elements drei Textfelder aktivieren/deaktivieren. Der Aufbau der vier beteiligten Steuerelemente sieht, bevor wir die benötigten Bindungen hinzufügen, wie folgt aus (siehe Bild 1):

Abhängigkeit per Binding realisieren

Bild 1: Abhängigkeit per Binding realisieren

<CheckBox x:Name="chkGeschaeftskunde" Margin="5" Grid.Column="1" VerticalAlignment="Center" />
<TextBox x:Name="txtFirma" Grid.Row="2" Grid.Column="1" Margin="5" />
<TextBox x:Name="txtVorname" Grid.Row="3" Grid.Column="1" Margin="5" />
<TextBox x:Name="txtNachname" Grid.Row="4" Grid.Column="1" Margin="5" />

Binding für den gleichen Boolean-Wert

Ganz einfach ist die Lösung, wenn das Ändern einer Eigenschaft eines Elements eine Eigenschaft des anderen Elements mit dem gleichen Datentyp auslösen soll und die Werte der beiden Eigenschaften gleich sein sollen. Das ist bei uns der Fall, wenn wir das CheckBox-Element chkGeschaeftskunde und das TextBox-Element txtFirma betrachten: Wenn die Eigenschaft IsChecked von chkGeschäftskunde den Wert True hat, soll auch die Eigenschaft IsEnabled von txtFirma den Wert True aufweisen und umgekehrt. Beide Attribute haben den Datentyp Boolean. In diesem Fall können wir den Wert der Eigenschaft IsChecked von chkGeschaeftskunde direkt per Binding der Eigenschaft IsEnabled von txtFirma zuweisen:

<TextBox x:Name="txtFirma" ... IsEnabled="{Binding ElementName=chkGeschaeftskunde, Path=IsChecked}" />

Wann immer der Benutzer nun den Wert das Kontrollkästchen mit einem Haken versieht, wird auch das Textfeld aktiviert.

Binding für negierte Boolean-Werte

Bei dem Kontrollkästchen und den beiden übrigen Textfeldern wird es etwas komplizierter: Wir wollen ja nicht den gleichen Wert zuweisen, sondern den negierten Wert – hat die Eigenschaft IsChecked von chkGeschaeftskunde den Wert True, soll IsEnabled von txtVorname und txtNachname den Wert False aufweisen und umgekehrt. In einem Binding können wir aber nicht einfach wie unter C# den Operator Not verwenden, um einen Boolean-Wert umzukehren. Hier benötigen wir einen Converter, der in Form einer eigenen Klasse mit zwei Methoden daherkommt.

Ein Converter kann einfache Aufgaben übernehmen wie etwa das Umwandeln von True in False und umgekehrt, aber auch komplexere Operationen durchführen. In diesem Fall wollen wir eine Converter-Klasse namens BoolInvertConverter erstellen, indem wir per Strg + Umschalt + A den Dialog Neues Element hinzufügen öffnen, dort den Eintrag Klasse auswählen und den Namen BoolInvertConverter.cs angeben, bevor wir auf Hinzufügen klicken (siehe Bild 2). Nach dem Hinzufügen legen Sie in der Klasse noch einen Verweis auf einen Namespace an, der die gleich verwendete Schnittstelle IValueConverter nutzt:

Anlegen der Converter-Klasse

Bild 2: Anlegen der Converter-Klasse

using System.Windows.Data;

Für die Implentierung eines Converters gibt es bestimmte Regeln, die sich in Form einer Schnittstellendefinition niederschlagen. In der neu erstellten Klasse fügen Sie nun also durch einen Doppelpunkt getrennt hinter dem Klassennamen die Schnittstelle IValue­Converter hinzu:

public class BoolInvertConverter : IValueConverter {
}

IValueConverter wird nun rot unterstrichen dargestellt, was daran liegt, dass wir die Member der Schnittstelle noch nicht implementiert haben. Das holen Sie am einfachsten nach, indem Sie mit der rechten Maustaste auf den Namen der Schnittstelle klicken, den Kontextmenü-Eintrag Schnellaktionen und Refactorings... auswählen und im nun erscheinenden Popup auf Schnittstelle implementieren klicken. Dies fügt die folgenden beiden Methoden zur Klasse hinzu:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
     throw new NotImplementedException();

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]