DataTemplates und Markup Extensions verkleinern die Lücke zwischen Silverlight und WPF

Silverlight 5 und MVVM – Fight the Gap
Kommentare

Die Möglichkeit, eigene Markup Extensions zu schreiben, bietet für Silverlight-Entwickler die Gelegenheit, ihren Code deklarativer zu gestalten. Die Angabe eines Datentyps an einem „DataTemplate“ bringt unmittelbare Vorteile beim Einsatz des Model-View-ViewModels (MVVM). Beide Features erleichtern die Nutzung von MVVM. Dadurch nähern sich Windows Presentation Foundation (WPF) und Silverlight immer weiter an, was die Wiederverwendung von Code vereinfacht.

Silverlight 5 bringt wie bisher jedes Major-Release der Plattform viele Neuerungen mit, eine umfassende Übersicht gibt zum Beispiel Tim Heuer in seinem Blog. So bietet das Plug-in in der Version 5 unter anderem die Unterstützung echter 3-D-Grafik, Debugging in Datenbindungen, Trusted Applications im Browser, Doppel- und Mehrfachklicks und bessere Textdarstellung. Dieser Artikel konzentriert sich auf zwei Features, die noch wenig Aufmerksamkeit von den Medien bekommen haben, dafür aber Entwicklern, die das MVVM-Muster umsetzen, mit mächtigen Werkzeugen unterstützen: implizite DataTemplates und die Möglichkeit, eigene MarkupExtensions zu entwickeln. Beide Features werden an Beispielen erläutert, wobei jeweils auf noch vorhandene Unterschiede zur WPF eingegangen wird. 

Implizite DataTemplates

Dieses Feature ist zur Umsetzung von MVVM unter WPF besonders praktisch. Doch zunächst folgt ein einfaches Beispiel, das in Listing 1 nachvollzogen werden kann: Ein ContentControl kann ein beliebiges Objekt, den Content, anhand eines definierten Templates, des ContentTemplates, darstellen. Mithilfe eines impliziten DataTemplate kann man den Code wie in Listing 2 gezeigt verändern. Man beachte, dass das DataTemplate nun keinen Key mehr besitzt, sondern das mit Silverlight 5 neu hinzugekommene Attribut DataType. Da das Template nun keinen Key mehr besitzt, kann es im ContentControl auch nicht mehr als statische Ressource über diesen angesprochen werden. An dieser Stelle ist der Verweis auf das Template ersatzlos entfallen. Stattdessen wird nun aufgrund des Typs des Contents entschieden, welches Template verwendet wird. Dadurch wird das ContentControl von einem konkreten Template entkoppelt, was eine Veränderung der Visualisierung erleichtert.

Listing 1

 
 
 
 
 
 
 
 
 
Display.Content = new Dog() {Name = "Bello", Age = 3};   

Listing 2

 
 
 
 
 
 
 
 
 
Display.Content = new Dog() {Name = "Bello", Age = 3};   

Implizite DataTemplates und MVVM

Im MVVM-Umfeld ist das zum Beispiel nützlich, um Views zu einem ViewModel zu finden. Als Beispiel dient eine vereinfachte Navigation zwischen verschiedenen Masken innerhalb einer Anwendung. Der Einfachheit halber gibt es für jede Maske in der MainPage einen fest im XAML definierten Button, der an ein entsprechendes Command gebunden ist (Listing 3). Das ViewModel dazu ist ebenfalls denkbar einfach, wie in Listing 4 zu sehen ist. Die Klasse ViewModelBase erledigt hier einen Großteil der Arbeit, insbesondere die Bindung der mit Execute_ beginnenden Command-Methoden an die Buttons in der View. Wer wissen will, wie das funktioniert, kann sich den Code auf der Heft-CD ansehen oder unter House of Bliz nachlesen, von wo diese Klasse stammt. Für den Moment genügt es zu wissen, dass bei einem Klick auf die Buttons die entsprechende Execute-Methode im ViewModel ausgeführt wird. Die Methoden Get und Set zur Speicherung der Properties sind ebenfalls in der Basisklasse definiert und verwalten die Werte zu den Eigenschaften in einem Dictionary. 

Listing 3: Die MainView.xaml

 
 
 
 
 
 

Listing 4: Die MainPageViewModel.cs

public class MainPageViewModel : ViewModelBase 
{ 
public ViewModelBase Content 
{ 
get 
{ 
return Get(() => Content); 
} 
set 
{ 
Set(() => Content, value); 
} 
} 
public void Execute_ShowContent1() 
{ 
Content = new Content1ViewModel(); 
} 
public void Execute_ShowContent2() 
{ 
Content = new Content2ViewModel(); 
} 
}   
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -