Silverlight 5 und MVVM – Fight the Gap (Teil 2)
Kommentare

In den Execute-Methoden der Navigationsbuttons wird der Content, der an die Content-Eigenschaft des ContentControl gebunden ist, auf das ViewModel passend zur gewünschten Seite gesetzt, also entweder

In den Execute-Methoden der Navigationsbuttons wird der Content, der an die Content-Eigenschaft des ContentControl gebunden ist, auf das ViewModel passend zur gewünschten Seite gesetzt, also entweder auf Content1ViewModel oder Content2ViewModel. Damit nun auch die passende View angezeigt wird, muss eine Zuordnung zwischen View und ViewModel geschaffen werden. Und das passiert über die neue DataType-Eigenschaft wie folgt in der App.xaml

 
 
 
 
 
   

ContentView1 und ContentView2 sind die UserControls, die die Views zu den entsprechenden ViewModels darstellen. Entscheidend ist die Zuordnung von ViewModel zur View über die DataType-Eigenschaft. Auf diese Weise lässt sich die Darstellung eines ViewModel leicht und an zentraler Stelle variieren.

Eigene MarkupExtensions

Die Verwendung von MarkupExtensions gehört zum XAML-Alltag. Prominente Vertreter dieser Gattung sind zum Beispiel Binding und StaticResource. In WPF gibt es noch mehr vordefinierte Erweiterungen, zum Beispiel Static, Null oder DynamicResource. Überall dort, wo im Markup geschweifte Klammern auftauchen, kommen MarkupExtensions ins Spiel. In WPF gehört es bereits seit Langem zu den Möglichkeiten des Entwicklers, eigene Extensions zu schreiben. Hierzu muss von der Klasse MarkupExtension abgeleitet werden, die in Silverlight bis zur aktuellen Version 4 noch nicht zur Verfügung stand. Ein Umstand, den Microsoft mit der kommenden Version 5 abstellen wird. Eingesetzt werden die Erweiterungen überall dort, wo der Wert einer Property nicht „gradlinig“, sondern über „Umwege“ ermittelt wird. Das beste Beispiel hierfür sind die bereits erwähnten Bindings: Der Wert einer gebundenen Eigenschaft wird erst bestimmt, wenn über den DataContext ein Objekt bereitgestellt wird, das über eine entsprechende Property verfügt. Auch der Wert einer statischen Ressource wird durch einen Suchprozess ermittelt: ausgehend vom aktuellen Element wird jeweils die Ressourcenauflistung nach einem Element mit dem gewünschten Namen durchsucht. Wird nichts gefunden, fährt die Suche entlang des Visual Tree bis zur App.xaml fort. Eine einfache und nur zu Demonstrationszwecken nützliche MarkupExtension sieht wie folgt aus: 

public class SimpleExtension : MarkupExtension 
{ 
public override object ProvideValue(IServiceProvider serviceProvider) 
{ 
return "Hallo MarkupExtension"; 
} 
} 

Anstatt von der Klasse MarkupExtension zu erben, kann auch das Interface IMarkupExtension implementiert werden, wobei der Typparameter für den erwarteten Rückgabewert steht. Der zentrale Punkt der MarkupExtension ist die Überschreibung der Methode ProvideValue, die den geforderten Wert liefern muss. Im einfachsten Fall handelt es sich dabei wie im Beispiel um einen konstanten Wert. Bei der Verwendung der Erweiterung fällt auf, dass das Suffix „Extension“ des Klassennamens SimpleExtension „abgeschnitten“ wird. Erweiterungen können auch Parameter übernehmen. Ergänzt man in der Klasse SimpleExtension die Properties

public String Title { get; set; } 
public String Name { get; set; }   

kann man im XAML Folgendes schreiben:

Auf die Werte der Properties kann dann in der ProvideValueMethode normal zugegriffen werden. Wer in WPF schon einmal eigene MarkupExtensions geschrieben hat, weiß, dass dort auch Konstruktorparameter möglich sind. Bei diesen kann der Property-Name in der Deklaration im XAML weggelassen werden, ein Beispiel hierfür ist die Property Path der BindingExtension. Das ist zumindest zurzeit in Silverlight 5 noch nicht möglich und wird vom Parser mit einem ‚UnknownPositionalParameter‘-Fehler quittiert. Vielleicht wird sich das aber bis zum Release noch ändern.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -