21 Datenbindung
In WinForms konnten Sie recht einfach eine Datenbindung realisieren. Sie waren dabei aber auf bestimmte Controls beschränkt, die über entsprechende Eigenschaften verfügen. Die Datenbindung von WPF bietet viel flexiblere Möglichkeiten, denn alle Eigenschaften – genau genommen alle abhängigen Eigenschaften – sind datenbindungsfähig.
Die Datenquellen sind ausgesprochen vielfältig:
- Es kann sich bei der Datenquelle um die Eigenschaft einer anderen Komponente handeln.
- Die Daten können aus einer XML-Datei bezogen werden.
- Daten können einer Collection entnommen werden.
- Dass Datenbanken ebenfalls Datenquellen darstellen, versteht sich fast wie von selbst.
Eine andere Voraussetzung muss aber erfüllt sein: Die Datenbindung funktioniert nur zusammen mit Dependency Propertys. Eine Datenquelle kann also nur an eine Dependency Property gebunden werden. Erfreulicherweise können die meisten Eigenschaften diese Bedingung erfüllen.
21.1 Wichtige Klassen 

Bei der WPF-Datenbindung spielen zwei Klassen eine besondere Rolle:
- Binding
- DataContext
Ehe wir uns mit den ersten Beispielen beschäftigen, möchte ich Ihnen diese Klassen kurz vorstellen.
21.1.1 Die Klasse »Binding« 

Ein Binding-Objekt beschreibt die Bindung zwischen einer Datenquelle und einer bindenden Komponente. Meistens wird die Bindung im XAML-Code beschrieben, aber selbstverständlich kann die Bindung auch im C#-Code erfolgen. Die wichtigsten Eigenschaften des Binding-Objekts können Sie Tabelle 21.1 entnehmen. Viele der aufgeführten Eigenschaften werden Sie im Verlauf des Kapitels noch innerhalb der Beispielprogramme wiederfinden.
Eigenschaft | Beschreibung |
Converter |
Diese Eigenschaft gibt an, welches Objekt als Konverter zwischen zwei Datentypen dienen soll. |
ElementName |
Diese Eigenschaft gibt den Bezeichner des Elements an, das als Datenquelle dient. |
Mode |
Legt den Bindungsmodus fest. Damit lässt sich die Verhaltensweise einer eventuellen gegenseitigen Aktualisierung zwischen Datenquelle und Datenziel steuern. |
NotifyOnSourceUpdate / NotifyOnTargetUpdate |
Mit diesen Eigenschaften werden Ereignisse ermöglicht, die beim Aktualisieren der Datenquelle oder des Datenziels auftreten. |
Path |
Mit Path wird die Eigenschaft festgelegt, an die Daten gebunden werden sollen. |
RelativeSource |
Diese Eigenschaft legt die Datenquelle fest, allerdings relativ zum Datenziel. |
UpdateSourceTrigger |
Mit dieser Eigenschaft wird angegeben, wann die Datenquelle aktualisiert werden soll. |
21.1.2 Die Klasse »DataContext« 

Die Klasse DataContext kann man sich als Bindeglied zwischen der eigentlichen Datenquelle und den bindenden Steuerelementen vorstellen. DataContext stellt die Daten bereit; das Steuerelement weiß aber noch nicht, welche es anzeigen soll.
Jedes von FrameworkElement abgeleitete Steuerelement verfügt über die Eigenschaft DataContext. Darüber wird die Datenquelle festgelegt, die bei Verwendung des Binding-Objekts verwendet werden soll. Sie können mit
textBox1.DataContext = datenquelle;
dem Steuerelement zwar seinen Datenkontext mitteilen, aber flexibel ist diese Lösung nicht. Besser, Sie weisen die Datenquelle an DataContext des übergeordneten Containers oder der Form zu. Davon profitieren alle enthaltenen Elemente, die dann ebenfalls das in DataContext angegebene Objekt als Quelle nutzen. Eine geschickte Zuweisung kann also von vielen Steuerelementen genutzt werden.
Um alle Steuerelemente eines Window am gleichen DataContext teilhaben zu lassen, weisen Sie die Daten dem DataContext des Window zu. Am geeignetsten ist dafür der Konstruktor:
public MainWindow() { this.dataContext = datenquelle; }