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

Über den IRootObjectProvider erhält man das UserControl, in dem sich das Steuerelement befindet, auf das die Erweiterung angewendet wurde. Hierdurch ermitteln wir den Typ des UserControls, den wir als

Über den IRootObjectProvider erhält man das UserControl, in dem sich das Steuerelement befindet, auf das die Erweiterung angewendet wurde. Hierdurch ermitteln wir den Typ des UserControls, den wir als erstes Element unseres Schlüssels benötigen. Das Interface IProvideValueTarget liefert uns das Steuerelement, auf das die Erweiterung angewendet wird (im Beispiel oben als ein Textblock). Dabei sollte es sich im Regelfall um ein FrameworkElement handeln. Aus diesem gewinnt man den Namen des Steuerelements für den Schlüssel. Er sollte dementsprechend auch gesetzt sein. Der Name der Eigenschaft lässt sich ebenfalls einfach aus dem PropertyInfo ermitteln, dass von der TargetPropertyEigenschaft geliefert wird.

Der Schlüssel kann nun vollständig zusammengesetzt werden. Der gelieferte Wert soll eine Datenbindung an das Wörterbuch werden. Hierdurch lässt sich später eine On-the-fly-Sprachumschaltung realisieren. Dabei muss man sich vor subtilen Speicherlecks in Acht nehmen. Dann kann ein Binding-Objekt erstellt werden, das das aktuelle Wörterbuch als Datenquelle und als Pfad den zusammengebauten Schlüssel verwendet. Da die Bindung gegen den Indexer des Wörterbuchs geht, muss der Schlüssel noch in eckige Klammern gesetzt werden. Über die ProvideValue-Methode wird der Wert der Bindung zurückgeliefert.

Die TranslateExtension im Einsatz

Beim Starten der Anwendung setzt man das aktuelle Wörterbuch wie folgt:

LanguageDictionary.Current = new TestLanguageDictonary(new CultureInfo("de-DE"));  

Das Wörterbuch ist selbst dafür zuständig, die übersetzen Ressourcen zu laden. Ein Beispiel für die Verwendung der Erweiterung im XAML wurde bereits gegeben. Um die Sprache umzuschalten, setzt man einfach ein anderes Wörterbuch ein: 

public void Execute_SwitchLanguage(object CultureCode) 
{ 
String CultureName = CultureCode.ToString(); 
CultureInfo Culture = new CultureInfo(CultureName); 
LanguageDictionary.Current = new TestLanguageDictonary(Culture); 
}   

Bei einem erneuten Aufruf einer Maske wird dann der übersetzte Text verwendet. In Abbildung 1 ist ein Versuch der Visualisierung des Ablaufs zu sehen. Die vorgestellte Lösung ist sicher noch nicht produktionsreif. Aber sie enthält viele Informationen darüber, wie man MarkupExtensions entwickeln und einsetzen kann. Wer diesen Ansatz zur Lokalisierung weiter verfolgen möchte, deren Ideen man, ausgerüstet mit dem passenden Grundwissen, in eine eigene Lösungen einfließen lassen kann. 

Fazit

Die beiden vorgestellten neuen Features von Silverlight 5 genießen, verglichen mit anderen Features, vielleicht nicht so viel Aufmerksamkeit. Trotzdem sind sie kleine Goldstücke, die bei der Umsetzung von MVVM sehr hilfreich sein können. Gerade die eigenen MarkupExtensions haben noch viel Potenzial, wie Beispiele aus WPF wie DynamicResource, Null oder Static und andere zeigen. Insgesamt ist die Lücke zwischen WPF und Silverlight durch diese Ergänzungen wieder etwas kleiner geworden, was die Umsetzung von Mulit-Target-Szenarien weiter vereinfacht. Es bleibt zu hoffen, dass Microsoft diesen Kurs beibehält und die technischen Unterschiede zwischen WPF und Silverlight Schritt für Schritt weiter minimiert. 

Tobias Richling wohnt in einer kleinen Stadt im Münsterland. Er arbeitet als Softwareentwickler bei der LIS AG und ist dort mit der Evaluation und Einführung neuer .NET-Technologien betraut. Derzeit gehören ASP.NET, Silverlight und WCF zu seinen primären Themenfeldern. Ein besonderer Fokus liegt dabei auf der Cliententwicklung mittels MVVM. Sie erreichen ihn unter trichling@lis.eu

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -