In der Modellstufe habe ich eine Aufzählung definiert:
%Vor%Aus meiner Sicht habe ich ein Kombinationsfeld, das mit diesen Aufzählungswerten gefüllt ist:
%Vor%Dies führt dazu, dass das Kombinationsfeld mit den Auswahlmöglichkeiten übereinstimmt, die genau mit den Werten übereinstimmen, die in der Aufzählung definiert sind. Obwohl das mein ursprüngliches Ziel war, möchte ich eine bessere Präsentation für den Benutzer, etwa so:
Auch wenn sich die Sprache in der Anwendung ändert, brauche ich die enum-Werte in dieser Sprache. Um dies anzugehen, kam mir als Erstes ein Konverter für MemberStatus
enum-Werte in den Sinn. Ich fand diesen schönen Artikel zum Thema: Ссылка Aber MVVM-Muster sagt, dass es keine Notwendigkeit zu erstellen gibt sie fast überhaupt - und ich stimme dem zu. Diese Bestätigung funktioniert jedoch in diesem Beispiel nicht zu meinen Gunsten.
Wie soll es gemacht werden? Vielen Dank.
Die Ansicht, dass MVVM Wertwandler überflüssig macht, scheint von Josh Smith zu stammen, der in seinem Blogbeitrag Die Philosophien von MVVM :
... eine ViewModel-Klasse ist im Wesentlichen ein Wertwandler auf Steroiden, also Rendern des IValueConverter Schnittstelle für die meisten irrelevant Bindungen.
Was ich daraus entnehme (und ich stimme ihm zu, was es wert ist), ist, dass das View-Modell für die gesamte Konvertierung von der Weltansicht des Modells zu den Views verantwortlich ist und den Konverter obsolet macht.
Ein Enum (ein sehr datenzentrischer Datentyp) im Model, das bis zur Benutzeroberfläche verfügbar ist, ist definitiv ein Geruch - wenn nur aus dem Grund, den Sie sehen, dem Benutzer weniger als ideale Informationen zu zeigen.
>Fügen Sie eine Zuordnung von enum zu UI-Zeichenfolge in Ihrem Ansichtsmodell hinzu.
Konverter sind nützlich für viel mehr als das Konvertieren von enum
s. Konverter sind auch wiederverwendbar als eine einmalige viewmodel
.
Ich möchte vielleicht ein bool
in ein Brush
umwandeln und ich kann die Parameter in der Ansicht angeben.
Oder vielleicht möchte ich ein string
in DateTime
und wieder alles via Datenbindung konvertieren. Vielleicht möchte ich alles in Großbuchstaben umwandeln. Dann gibt es meinen bevorzugten BoolToVisibilityConverter .
Ich würde es hassen, explizit direkten oder indirekten Code in meinem VM
s zu verwenden, nur um einige Minderheiten glücklich zu machen. Die Sache, die ich behaupten würde, sie vergessen, ist, dass Konverter von Expression Blend leicht zugänglich sind.
Konverter sind ein wesentlicher Bestandteil von WPF und ergänzen Bindungen zwischen view
und viewmodel
.
Ich sehe keinen Grund, warum Sie sie nicht für enum
s verwenden können.
MVVM ist nicht wirklich in Stein gemeißelt, welche Teile von WPF sind und nicht erlaubt sind. Konverter sind in Ordnung, wenn sie Ihr Ziel leicht erreichen. Ich würde sogar vorschlagen, einen Schritt weiter zu gehen und ein MarkupExtension
zu machen, um die Enum-Werte und ihre Entsprechungen zu liefern. Sie könnten die Zeichenfolgen in DescriptionAttribute
für jeden Aufzählungswert speichern.
Ich stimme nicht zu, dass MVVM ValueConverters obsolet macht. Es gibt mehr als genug Szenarien, in denen die Implementierung eines ValueConverters sinnvoller ist, wenn die Konvertierung in der ViewModel-Klasse implementiert wird.
Sie könnten an der BookLibrary Beispielanwendung des WPF-Anwendungsframeworks (WAF) interessiert sein . Es zeigt, wie eine Enum in einer MVVM-Anwendung lokalisiert werden kann. Bitte sehen Sie sich die BookLibrary.Presentation / Converters / LanguageToStringConverter-Klasse an.