Wirbel um Visual Studio 2010: Verbesserungen beim WPF-Editor

Werkzeuge  –  Kommentare

Zwar ist noch nicht alles Gold, was glänzt, aber für heise Developer-Autor Peter Monadjemi ist der neue WPF-Editor in Visual Studio 2010 ein Schritt in die richtige Richtung, Einfachheit mit Komfort zu kombinieren.

Zwei Dinge gleich vorweg: Der WPF-Editor von Visual Studio 2010 (VS 2010) ist auch in der aktuellen Version noch nicht mit Microsofts Blend zu vergleichen. Microsoft hat ihn im Vergleich zum Vorgänger lediglich in Kleinigkeiten überarbeitet. Die lästige Aufforderung, den Designer neu zu laden, die bei VS 2008 praktisch nach jeder etwas umfangreicheren Änderung am XAML-Code in der Informationsleiste des WPF-Designers erscheint, taucht bei VS 21010 nicht mehr auf.

Grundsätzlich ist der Designer für WPF- und Silverlight-Anwendungen, dessen Codename "Cider" Microsoft-Entwickler nach wie vor in ihren Blogs, Vorträgen und Foren verwenden, der alte geblieben. Die aktuelle Version bietet eine Reihe kleinerer Verbesserungen, die sich auf Komfort und Performance positiv auswirken. Die wichtigste Neuerung ist, dass sich eine Datenbindung endlich per Drag & Drop einrichten lässt. Auch wenn die Vorgehensweise (vielleicht zu Recht) bei vielen Entwicklern nicht allzu hoch im Kurs steht, bringt sie klare Vorteile, da die WPF-Datenbindung deutlich mächtiger ist als die von WinForms und das Einrichten einer Datenbindung weniger erfahrene Entwickler vor eine echte Herausforderung stellt.

Während man mit WinForms unter VS 2008 bei der Auswahl der DataSource-Property eines DataGridView unter anderem eine neue Datenquelle anlegen konnte, gab es beim WPF-Editor bislang nichts Vergleichbares. Das Herstellen einer Datenbindung war nur direkt im XAML- oder Programmcode möglich, was in beiden Fällen bereits gute WPF-Kenntnisse voraussetzte.

Bei VS 2010 kann der Entwickler zum Beispiel der ItemsSource Property (wie grundsätzlich jeder DependencyProperty) Elemente einer Datenquelle zuordnen, indem er die Elemente aus einem Auswahldialog auswählt. Dadurch werden die erforderlichen Markup-Erweiterungen und Befehle im XAML- bzw. Programmcode eingefügt. Für Entwickler, die bei WPF erst am Anfang stehen, dürfte das sogar die Gewähr dafür sein, überhaupt eine Datenbindung hinzuzubekommen. Auch die typische Drag&Drop-Datenbindung ist möglich, indem man aus einer zuvor angelegten Datenquelle eine Tabelle oder ein Feld auf ein Fenster oder eine Seite zieht.

Wie bei der WinForms-Datenbindung kann pro Tabelle oder Feld ausgewählt werden, welches Steuerelement das Feld darstellen soll – für Tabellen steht neben DataGrid und ListView eine aus einzelnen Steuerelementen bestehende Detailansicht zur Auswahl. Auf die Weise lassen sich Master-Detail-Beziehungen abbilden. Die Auswahl der zur Verfügung stehenden Steuerelemente bei einem Feld richtet sich nach dessen Typ. Theoretisch kann man auch Custom Controls in die Auswahl aufnehmen.

Das Ziehen und Ablegen einer Tabelle führt per Standardeinstellung dazu, dass das mit WPF 4.0 neu eingeführte DataGrid Control auf dem Fenster oder der Seite platzier wird. In den Ressourcen des Fensters oder der Seite wird eine CollectionViewSource definiert, die per Datenbindung auf das ebenfalls in den Ressourcen platzierte DataSet verweist.

Der XAML-Code sieht wie folgt aus:

<Window.Resources>
<my:NWDS x:Key="nWDS" />
<CollectionViewSource x:Key="employeesViewSource" Source={Binding
Path=Employes, Source={StaticResource nWDS}" />
</Window.Resources>

Beim DataGrid wird die DataContext Property auf die CollectionViewSource gesetzt:

<Grid DataContext="{StaticResource employeesViewSource}">
</Grid>

Die einzelnen Spalten des Grids werden über ihre Binding Property mit einem Feld verknüpft:

<DataGridTextColumn Binding="{Binding Path=EmployeeID}" />
Die Datenbindung kann bei VS 2010 direkt im Property-Fenster eingestellt werden (Abb. 1)

Besitzt ein Element einen DataContext, lassen sich weitere Steuerelemente an Felder binden, die der
DataContext zur Verfügung stellt. Es ist eine weitere Neuerung des WPF-Editors, dass der Anwender bei jeder Property im Property-Fenster die "Advanced Properties" einstellen kann. Zur Auswahl stehen die Einträge "Reset Value", "Apply Data Binding", "Apply Resource" und "Extract Value to Resource". Kleine Marker zeigen bei jeder Property an, woher sie ihren Wert bezieht, etwa ob sie direkt eingegeben wurde oder per DataBinding zur Verfügung gestellt wird. Nach Auswahl von "Apply Data Binding" erscheint der "Bindungsdesigner", in dem man unter anderem den Wert für die Path Property des Binding-Objekts auswählen kann (der für WinForms-Entwickler unter Umständen etwas ungewöhnliche Dialog wird durch das erneute Selektieren der Eigenschaft im Property-Fenster wieder geschlossen).

Dafür, dass die CollectionViewSource ihre Daten erhält, sorgen ein paar Codezeilen, die der Entwickler durch das Einrichten der Datenbindung in die Loaded-Eventprozedur des Fensters beziehungsweise der Seite eingefügt. Ein

NWDS nWDS = (NWDS)(this.FindResource("nWDS"));
NWDSTableAdapters.EmployeesTableAdapter nNWDSEmployeesTableAdapter
= new NWDSTableAdapters.EmployeesTableAdapter();
nNWDSEmployeesTableAdapter.Fill(nWDS.Employees);

lädt die Datensätze über den zuständigen typisierten TableAdapter aus der Datenbank. Ein

CollectionViewSource employeesViewSource = 
(CollectionViewSource)(this.FindResource("employeesViewSource"));

weist die CollectionViewSource einer Variablen zu, sodass über diese Variable zum Beispiel eine
Navigation in der Datensatzgruppe möglich ist:

employeesViewSource.View.MoveCurrentToFirst();

Allzu groß ist der Unterschied zum WinForms-Databinding daher nicht.