Wie kann ich mit WPF Daten binden?

Voraussetzungen:

Plattform
.NET Framework 3.5 SP1
Sprachen
XAML, C#
Werkzeuge
Visual C# 2008, Expression Blend 2.0 (optional), Expression Design (optional)
Zu bearbeitende Projekte
Microsoft.WPF.Samples.BizCardFlow

Datenbindung

Mit WPF ist ein neues Datenbindungs-System erschienen, welches das Synchronisieren von Objekteigenschaften und Objektsammlungen mit einem oder mehreren Steuerelementen vereinfacht. Ziel ist es, die Arbeit für das Aktualisieren einer Benutzerschnittstelle so gering wie möglich zu halten. Die Synchronisation der Daten zu dem Steuerelement wird über die beiden Interfaces INotifyPropertyChanged und INotifyCollectionChanged bereitgestellt.

Ist ein Steuerelement mit dem Datenbindungs-System verbunden, bestehen mehrere Möglichkeiten, den Datenaustausch zwischen dem Bindungsziel und der Bindungsquelle zu steuern:

  • OneTime (Updates werden ignoriert)
  • OneWay (Read-Only)
  • TwoWay (Read-Write)
  • OneWayToSource (Write-Only)

Diese Einstellungen können mit der Eigenschaft „MODE“ von jedem Bindungselement gesteuert werden.

Es gibt die Möglichkeit, bei einem gebundenen Element einen Konverter zwischen das Bindungsziel zu schalten. Dabei wird ein Wert, an den ein Steuerelement gebunden ist, mit Hilfe des Konverters umgewandelt. Konverter arbeiten parallel zu der Synchronisation, wie in Abbildung 1 zu erkennen ist. Bei einer „TwoWay“-Datenkommunikation, wandelt der Konverter Daten mit einer Hin- und Rückkonvertierungsroutine. Diese Konverter müssen jeweils das IValueConverter implementieren, um die beiden Methoden „Convert“ und „ConvertBack“ anbieten zu können.

Abbildung 2 zeigt die Beziehung zwischen dem Erscheinungsbild und der Logik eines Steuerelements. Der visuelle Teil eines Steuerelements wird nicht mehr von dem Steuerelement selbst bereitgestellt, sondern wird über das Template geladen. Ein Steuerelement ist dabei nicht gänzlich von dem visuellen Teil getrennt. Man kann also sagen, dass ein Steuerelement für die Funktionalität und das Template, für das Erscheinungsbild und das Binden der Daten verantwortlich ist.

Ressourcen

Jedes Objekt in WPF kann als Ressource ausgelagert werden. Beispielsweise können Farben, DataTemplates oder Brushes als Ressourcen ausgelagert werden, um sie später an einer zentralen Stelle verändern zu können. Neu in WPF ist die Eigenschaft „Resource“ eines jeden Framework-Elements, so dass man an beliebiger Stelle einer Applikation eine Ressource definieren kann. Die Infrastruktur der Ressourcenverarbeitung ist ein Mechanismus, um Objekte zu definieren und zu lokalisieren. Natürlich können auch Ressourcen gebunden werden.

Anwendungsbeispiel BizCardFlow

BizCardFlow wurde als Steuerelement konzipiert und nutzt die Möglichkeiten der Windows Presentation Foundation aus. So sind beispielsweise alle visuellen Komponenten von BizCardFlow als Ressource an einer zentralen Stelle ausgelagert. Die Datenbindung an die Personen findet jeweils in den Front- und Back-Templates des Steuerelements statt, welche wiederrum als Data-Templates in das ResourceDictionary ausgelagert wurden. Somit ist das Steuerelement CoverFlowList nur noch für das Verwalten und Anzeigen „gesichtsloser“ Container verantwortlich, weil die visuelle Repräsentation und das Binden an die Personendaten über das Template gesteuert wird.

Damit der BizCardFlow funktioniert, müssen Ihm also zunächst einmal Daten übergeben werden, die es visualisieren soll. Dies geschieht über die Eigenschaft ItemsSource im BizCardFlow-Steuerelement.

In unserem Beispiel werden die Personen in der Code-Behind-Datei windows1.xaml.cs übergeben.

    var ppl = new People();
    BizCardFlow1.ItemsSource = ppl.GetPersons();

Listing 1: Datenübergabe an das BizCardFlow –Steuerelement

Zu diesem Zeitpunkt können die Personendaten von dem BizCardFlow über das neue Datenbindungs-System der Windows Presentation Foundation gebunden werden. Das Binden der Personendaten findet im BizCardFlow über die Front- bzw. BackTemplates statt. Diese sind wiederum als Ressource in einem RessourceDictionary ausgelagert. Um die Templates des BizCardFlow editieren zu können, müssen wir also die Datei ResourceDictionary.xaml editieren.

    <DataTemplate x:Key="BackTemplate">
    <Border BorderBrush="{Binding Path=Gender, Converter={StaticResource
    GenderToSolidColorBrush}}" ……

Listing 2: Datenbindung der Backtemplate-Eigenschaft

Wenn wir uns beispielsweise das Data-Template für das Back-Template des BizCardFlow ansehen, können wir bereits in der ersten Zeile sehen, dass die Eigenschaft BorderBrush mit Hilfe des Datenbindungs-Systems an die Eigenschaft Gender einer Person gebunden ist und mit Hilfe eines Konverters in eine SolidColorBrush umgewandelt wird.

Der Konverter ist im RessourceDictionary mit einem Schlüssel „GenderToSolidColorBrush“ versehen und kann deshalb über das Schlüsselwort StaticResource referenziert werden. Diese Referenz verweist wiederum auf die Klasse GenterToSolidColorBrush.cs, welche das Interface IValueConverter implementiert, um einen String in eine SolidColorBrush umzuwandeln. Der Konverter wandelt nun in Abhängigkeit von der Gender-Eigenschaft einer Person einen String in eine blaue oder pinke BorderBrush um, und leitet diese an die Dependency-Eigenschaft der BorderBrush weiter. Somit entscheidet die Gender-Eigenschaft einer jeden Person, wie sich das Erscheinungsbild im Back-Template verändern soll.

WPF Fast Start