2010-11-24 6 views
1

Ich weiß, dass dies klingt ein bisschen ähnlich wie einige andere Fragen, aber ich habe keine gefunden, die meine Abfrage erfüllt, so bitte mit mir. Ich übersetze gerade eine meiner bestehenden Anwendungen in das MVVM-Muster, um die Struktur zu verbessern, und ich bin ein bisschen verwirrt, was die beste Möglichkeit wäre, die Datenvalidierung durchzuführen.Beratung in Bezug auf Validierung in MVVM

Derzeit verwendet die Anwendung Datenbindung, um die Benutzeroberfläche und den Code zu verknüpfen, und verwendet einige Validierungsregeln und Wertkonverter, die für ähnliche Werte wiederverwendet werden können (jeweils einer für Daten usw.).

Während ich auf MVVM gelesen habe, bin ich auf IDataErrorInfo gestoßen, was ich als attraktiv empfinde, da es die Validierung aus der Sicht heraushält, wodurch Wiederholungscode bei der Einstellung von Bindungen usw. leicht reduziert wird und spezifischere Fehlermeldungen möglich sind.

ValidationRules auf der anderen Seite blockieren die Übertragung von Bindungsdaten, wenn die Validierung fehlschlägt, die ich brauche, weil ich nur die Modellwerte ändern möchte, wird ein neuer, gültiger Wert geliefert.

Meine Hauptsorge ist, dass wenn ich im Viewmodel zu sehr einschränke, dass dies die Sicht erschwert - ist es sinnvoll, im allgemeinen Fall auf ein angenehmes Maß zu beschränken und dann bestimmte Fälle zu beheben Brauchen Sie mehr Flexibilität in der Sicht?

Also meine Hauptfrage ist, wäre es besser, Validierung und Konvertierung in den Eigenschaften des Viewmodels zu setzen oder mit meinen Validierungsregeln und Wertumwandlern (oder einigen Kompromissen dazwischen) zu bleiben?

Danke, James

Antwort

2

Ich implementiere die gesamte Validierung im View-Modell unter Verwendung von IDataErrorInfo und lasse das Ansichtsmodell entscheiden, ob es Änderungen der Eigenschaften an das Modell übergeben soll, abhängig davon, ob die Eigenschaft gültig ist. So ein typischer Setter sieht ungefähr so ​​aus:

public string Value 
{ 
    set 
    { 
     if (value == _Value) 
     { 
     return; 
     } 
     _Value = value; 
     Validate("Value"); 
     if (Error["Value"] == null) 
     { 
     Model.Value = value; 
     } 
     OnPropertyChanged("Value"); 
    } 
} 

nie ich, je implementieren Validierung oder Wertumwandlung in der Ansicht. Das scheint nur nach Ärger zu betteln.

+0

Danke, ich hatte etwas Ähnliches im Sinn, war mir aber nicht sicher, ob es der richtige Weg war. Ich denke, das Viewmodel mit all dem Zeug umgehen zu lassen, ist der richtige Weg. – Moonshield

1

würde ich eine Kombination verwenden.

Ich verwende Idataerrorinfo in meinen Entitäten (Validierung ist nicht im Viewmodel) für Kern wiederverwendbare Geschäftsregeln. Meine Entitäten können sich auch auf diese Weise validieren.

Ich benutze dann View ValidationRules für Orte, wo ein Binding-Fehler nicht zu meiner Entität, wie wenn eine Zeichenfolge als Eingabe in einem Integer-Textfeld verwendet wird.

+0

Hmm, das ist eine Art der Richtung, in die meine Gedanken gehen. Es scheint eine gute Idee zu sein, alles an einem Ort zu behalten, aber ein wenig unpraktisch. Ich denke, ich könnte in der Ansicht/Bindung eine Typüberprüfung usw. durchführen, um die Validierungsregeln generischer zu machen, und dann die Werte überprüfen, bevor ich sie zurück zum Modell schiebe. – Moonshield