22 Elementbindungen
In den Kapiteln 19 bis 21 wurden viele Aspekte der Oberflächengestaltung diskutiert. Nun wird es Zeit, sich näher mit den speziellen WPF-Techniken zu beschäftigen. Dazu starten wir mit einem Thema, das sich durch die folgenden Kapitel wie ein roter Faden ziehen wird: den Bindungen. Man unterscheidet dabei zwei grundlegende Techniken: die Element- und die Datenbindung. Bei der Elementbindung wird die Eigenschaft eines Elements an die Eigenschaft eines anderen Elements gebunden, bei der Datenbindung handelt es sich um die Bindung einer Elementeigenschaft an eine allgemeine Datenquelle. In diesem Kapitel wird schwerpunktmäßig auf die Elementbindung eingegangen. In Kapitel 24 sehen wir uns noch die Details der allgemeinen Datenbindung an.
22.1 Einführung in die Bindungstechnik
Bindungen werden zwischen zwei Elementen definiert. Auf der einen Seite befindet sich eine Datenquelle, auf der anderen das Datenziel. Im Datenziel wird eine Eigenschaft oder auch mehrere an Daten gebunden, die die Datenquelle zur Verfügung stellt. Datenquellen können ausgesprochen vielfältig sein:
- Es kann sich bei der Datenquelle um die Eigenschaft eines anderen Elements (z. B. ein Steuerelement) handeln.
- Die Daten können aus einer XML-Datei bezogen werden.
- Daten können aus einer Auflistung oder gar aus einer Datenbank stammen.
Eine Voraussetzung muss dabei seitens des Datenziels erfüllt sein: Die Datenbindung funktioniert nur, wenn die Eigenschaft des Datenziels, an die eine Datenquelle gebunden wird, als Abhängigkeitseigenschaft (Dependency Property) implementiert ist. Erfreulicherweise erfüllen die meisten Eigenschaften der WPF-spezifischen Klassen diese Bedingung.
22.1.1 Ein einfaches Bindungsbeispiel
Bevor wir uns mit den Details der Elementbindung beschäftigen, wollen wir uns ein einfaches Beispiel ansehen, um den Bindungseffekt zu verstehen.
Die einfachste Bindung in der WPF ist sicherlich die Elementbindung zwischen zwei WPF-Elementen. Auch hier wird zwischen der Datenquelle und dem Datenziel unterschieden. Die Datenquelle stellt einen Wert zur Verfügung, das Datenziel bindet eine Eigenschaft an diesen Wert. Sollte sich der Wert in der Datenquelle ändern, wird auch die gebundene Eigenschaft des Datenziels geändert. Wie bereits erwähnt, muss die gebundene Eigenschaft des Datenziels dabei eine Bedingung erfüllen: Es muss eine Abhängigkeitseigenschaft (Dependency Property) sein.
Kommen wir zum angekündigten ersten Beispiel, und sehen Sie sich bitte Abbildung 22.1 an. Im Fenster ist oben eine TextBox und unten eine ListBox platziert. Die ListBox enthält ein paar Namen, von denen einer ausgewählt werden kann. Die Eigenschaft Text der TextBox ist an die ListBox in der Weise gebunden, dass der in der ListBox selektierte Name sofort in der TextBox angezeigt wird.
Abbildung 22.1 Einfache Datenbindung zwischen »TextBox« und »ListBox«
Sehen wir uns den XAML-Code an, auf dem die Abbildung basiert.
// Beispiel: ..\Kapitel 22\SimpleBinding
<Window ... >
<StackPanel>
<TextBox Height="25" Margin="10, 10, 10, 0" Name="textBox1"
Text="{Binding ElementName=listBox1,
Path=SelectedItem.Content}"/>
<ListBox Margin="10, 10, 10, 10" Name="listBox1">
<ListBoxItem>Michael</ListBoxItem>
<ListBoxItem>Gerald</ListBoxItem>
<ListBoxItem>Franz</ListBoxItem>
<ListBoxItem>Ralf</ListBoxItem>
<ListBoxItem>Sebastian</ListBoxItem>
<ListBoxItem>Thomas</ListBoxItem>
<ListBoxItem>Friedhelm</ListBoxItem>
<ListBoxItem>Karsten</ListBoxItem>
</ListBox>
</StackPanel>
</Window>
Listing 22.1 Der XAML-Code des Beispielprogramms »SimpleBinding«
Die Datenquelle ist in diesem Beispiel die ListBox. Für die Datenbindung sind bei diesem Element keine besonderen Maßnahmen notwendig. Die Bindung selbst ist in der TextBox definiert, dem Datenziel. Anstatt der Eigenschaft Text eine fixe Zeichenfolge zu übergeben, wird die Eigenschaft mit
Text="{Binding ElementName=listBox1, Path=SelectedItem.Content}"
an die ListBox gebunden. Datenbindungen werden mit der Markup-Erweiterung von XAML umgesetzt, d. h. innerhalb der geschweiften Klammern beschrieben. In der Markup-Erweiterung wird zuerst ein Objekt vom Typ Binding angegeben. Es müssen zwei Eigenschaften dieses Objekts festgelegt werden: ElementName und Path. ElementName beschreibt den Bezeichner des Elements, an das gebunden wird. Path gibt die Eigenschaft der Datenquelle an, an die gebunden werden soll. Die WPF verwendet den Ausdruck Path und nicht wie vielleicht erwartet Property, weil Path auf die Eigenschaft einer Eigenschaft zeigen kann – wie auch in unserem Beispiel SelectedItem.Content. In anderen Situationen kann es sich natürlich auch um die einfache Angabe einer Eigenschaft handeln (z. B. Text).
Wem die Bindung innerhalb einer Markup Extension zu unübersichtlich ist, kann die längere, besser strukturierte Schreibweise über XML-Knoten wählen.
<TextBox Height="25" Margin="10, 10, 10, 0" Name="textBox1" >
<TextBox.Text>
<Binding ElementName="listBox1" Path="SelectedItem.Content" />
</TextBox.Text>
</TextBox>
Listing 22.2 Lange Schreibweise einer Datenbindung
Um die Darstellung unseres ersten Beispiels zu vervollständigen, darf nicht unerwähnt bleiben, dass seine Datenbindung natürlich auch mit Programmcode möglich ist. Bezogen auf unser Beispielprogramm könnte die Bindung im Konstruktor des Window erfolgen, nach dem Aufruf der Methode InitializeComponent:
public MainWindow() {
InitializeComponent();
Binding binding = new Binding("SelectedItem.Content");
binding.ElementName = "listBox1";
textBox1.SetBinding(TextBox.TextProperty, binding);
}
Listing 22.3 Datenbindung mit C#-Code
Bemerkenswert ist die Anbindung der Eigenschaft Text an die durch das Binding-Objekt beschriebene Datenquelle mit der Methode SetBinding, der zwei Argumente übergeben werden. Dem ersten wird die Abhängigkeitseigenschaft des Datenziels genannt. Wahrscheinlich haben Sie hier textBox1.Text erwartet. Stattdessen wird aber TextBox.TextProperty angegeben. Dieser Schreibweise begegnen wir hier zum ersten Mal. Sie ist typisch für Methoden, die einen Parameter vom Typ DependencyProperty definieren.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.