Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Unter VBA waren die Möglichkeiten der Datenbindung überschaubar: Formulare, Berichte und einige Steuerelemente wiesen entsprechende Eigenschaften auf, die an Tabellen, Abfragen oder auch Wertlisten oder Felder geknüpft werden konnten. Unter WPF und C# sieht es ganz anders aus. Hier stehen Objekte im Vordergrund. Dieser Artikel zeigt daher zunächst, wie Sie Elemente wie Steuerelemente an die Eigenschaften anderer Elemente binden.
Einführung
Wenn Sie zuvor mit Access programmiert haben und dieses Magazin lesen, um zu erfahren, wie das, was Sie zuvor mit Access erledigt haben, mit C#/WPF gelingt, wollen Sie vermutlich nur eins: Daten aus Tabellen oder Abfragen in Fenstern und Steuerelementen anzeigen und diese zum Bearbeiten bereitstellen. Beim Thema Datenbindung ist WPF/C# allerdings etwas breiter aufgestellt, da es nicht nur auf Datenquellen wie Tabellen oder Abfragen fixiert ist, sondern primär auf Objekte als Datenlieferant.
Daher räumen wir das Feld etwas weiter auf und beginnen nicht gleich damit, die Daten per Fenster und Steuerelementen bereitzustellen. Zunächst einmal schauen wir uns an, wie Sie verschiedene Elemente aneinander binden können. Davon abgesehen haben Sie ja in vorhergehenden Artikeln der Kategorie Datenzugriffstechnik bereits einige Beispiele erhalten, wie dies gelingt. Grundsätzlich dient die Bindung aber dazu, nicht nur die Eigenschaften eines Elements an ein anderes Element zu binden, sondern die gebundenen Daten können auch aus Quellen wie einer XML-Datei, Auflistungen oder Datenbanken stammen.
Von Textfeld zu Textfeld
Im ersten Beispiel wollen wir schlicht und einfach, dass ein Textfeld den Inhalt eines anderen Textfeldes anzeigt. Unter Access/VBA haben Sie dazu das Nach Aktualisierung-Ereignis genutzt – oder auch das Bei Änderung-Ereignis. Das Erste hat beispielsweise auf die Eingabe- oder Tabulatortaste reagiert, Letzteres auf jede einzelne Änderung des Inhalts. Etwas eleganter konnten Sie dies erledigen, wenn Sie das erste Textfeld gleich der Eigenschaft Steuerelementinhalt des zweiten Textfeldes zugewiesen haben. Damit war noch nicht einmal mehr Code notwendig, um den Inhalt des ersten Textfeldes nach Änderungen in das zweite Textfeld zu übertragen.
Unter WPF/C# wollen wir uns gleich um die zweite Variante kümmern, also das zweite Textfeld an das erste Textfeld binden. Dazu fügen Sie einem Fenster eines neuen Projekts zwei Textfelder namens txtFeld1 und txtFeld2 hinzu:
<Window x:Class="Datenbindung.MainWindow" ... Title="MainWindow" Height="350" Width="525"> <Grid> <Label x:Name="lbl1" ... /> <Label x:Name="lbl2" ... /> <TextBox x:Name="txtFeld1" ... /> <TextBox x:Name="txtFeld2" ... /> </Grid> </Window>
Damit können Sie nun den Inhalt der beiden Textfelder beliebig ändern – es tut sich nichts. Dies ändern wir, indem wir die Methode MainWindow im C#-Modul des Fensters wie folgt um vier Zeilen erweitern:
public MainWindow() { InitializeComponent(); Binding binding = new Binding(); binding.ElementName = "txtFeld1"; binding.Path = new PropertyPath("Text"); txtFeld2.SetBinding(TextBox.TextProperty, binding); }
Diese vier Zeilen binden das zweite Feld so an das erste Feld, dass dieses immer den Inhalt des ersten Feldes anzeigt (siehe Bild 1). In diesem Fall werden Änderungen am Text des ersten Textfeldes direkt in das zweite Textfeld übertragen. Änderungen am zweiten Textfeld landen erst nach dem Verlassen im ersten Textfeld – wie Sie dieses Verhalten ändern, erfahren Sie weiter unten.
Bild 1: Das untere Textfeld ist an das obere Textfeld gebunden.
Schauen wir uns die vier Zeilen im Detail an. Die erste Zeile erzeugt ein neues Objekt des Typs Binding:
Binding binding = new Binding();
Die zweite Zeile weist der Eigenschaft ElementName des Binding-Objekts den Namen des ersten Textfelds txtFeld1 zu:
binding.ElementName = "txtFeld1";
Im Gegensatz zu Access/VBA, wo sich der Steuerelementinhalt eines Steuerelements immer auf den Steuerelementinhalt des angegebenen Quellsteuerelements bezogen hat, können Sie unter WPF alle Eigenschaften des mit Source angegebenen Objekts als Quellwert nutzen. In diesem Fall ist dies die Eigenschaft Text, die wir als neues PropertyPath-Objekt der Eigenschaft Path des Binding-Objekts zuweisen:
binding.Path = new PropertyPath("Text");
Schließlich müssen wir noch festlegen, welches Steuerelement das neue Binding-Objekt nutzen soll und welches die Zieleigenschaft ist. Dies erledigen wir mit der Methode SetBinding wie in der folgenden Anweisung. Der erste Parameter ist die Zieleigenschaft, hier TextProperty, der zweite das Binding-Objekt: