Soweit ich eine WPF-Anwendung mit MVVM entwickle, stelle ich das Modell niemals über die öffentliche Eigenschaft von viewmodel zur Verfügung. Wie auch immer, nachdem ich gerade in die Welt von Silverlight und WCF RIA gekommen bin, habe ich eine neue Methode gefunden, um eine Datenvalidierung zu erreichen, die mit Required Attribut angegeben wird. (Es gibt auch andere Attribute)
Dieses Mal, anstatt die Validierungslogik innerhalb des Viewmodels zu erstellen, kann ich beinahe eine Validierungslogik innerhalb des Modells selbst machen.
%Vor%Danach brauche ich in ViewModel nur die öffentliche Eigenschaft des Typs TestUserPM und lasse die Bindung direkt an das Modell anzeigen.
Ich denke, das ist keine elegante Lösung, aber es kann funktionieren und es muss keine langwierige Validierung innerhalb der Viewmodel-Eigenschaft erstellt werden.
Gibt es irgendwelche Nachteile dieser Methode?
Update 1
Ich habe gerade 1 down-side gefunden, vielleicht hat es da draußen eine Lösung. Ich möchte Button's Command binden, zum Beispiel Button speichern in Command in ViewModel, aber dieser Button kann genau dann ausgeführt werden, wenn alle Informationen gültig sind. Aus meiner Erfahrung mit WPF MVVM, die ich Helfer-Klasse habe, werde ich OnCanExecuteChanged()
in public string this[string columnName]
von IDataErrorInfo
aufrufen.
Wie kann ich mit dieser Art von Anforderung umgehen?
Ich belichte Model immer mit ViewModel, um die Dinge einfach zu halten und mich nicht zu wiederholen (DRY).
Um das Hinzufügen von Eigenschaften im Modell zur Anpassung an die Benutzeroberfläche zu vermeiden (wie Benjamin bemerkt), müssen Sie das Modell als eine Eigenschaft von viewModel beibehalten, damit Sie dem viewModel Eigenschaften hinzufügen können, ohne dass es zu Fehlern kommt das Modell.
ie: Das ViewModel ist der DataContext und hat eine Model-Eigenschaft, die das Modell zurückgibt
%Vor%Das Hauptproblem, das ich sehe, ist, dass Ihr Modell (das ein Geschäftsobjekt sein könnte) sich an die Benutzeroberfläche anpassen muss. Es könnte sich auf viele andere UI- oder Business-Layer auswirken.
Sie können sich mehrere UI mit unterschiedlichen Validierungsebenen für dasselbe Objekt vorstellen. Dies ist mit Ihrem Beispiel nicht möglich.
Das Problem ist, wie die anderen gesagt haben, dass Sie sich nicht an die Ansicht anpassen können. Allerdings möchte ich mich oft nicht wiederholen - wie Eduardo auch mit der Entblößung des Modells gesagt hat. Ich finde diese Lösung etwas nicht konsistent, wenn Sie einen Wert für die Ansicht ändern möchten - dann würden einige "Model.Name" und andere nur "Name" für die geänderte Eigenschaft binden - und einige Szenarien werden es einfach nicht arbeite so.
Meine Lösung besteht darin, eine ViewModelProxy-Klasse zu erstellen, in der Sie Eigenschaften aus einer anderen Klasse weiterleiten und eine Eigenschaftsbenachrichtigung kostenlos erhalten können. Es ist ziemlich einfach durch Ableiten von DynamicObject (ich habe Code-Benachrichtigung, IDataerror usw. weggelassen). Die coole Sache ist, dass alle Eigenschaften von Data weitergeleitet werden - wenn Sie eine Eigenschaft implementieren / überschreiben, an die gebunden wird - so müssen Sie auf diese Weise Code nicht wiederholen und Sie haben eine vernünftige Sache, DynamicObject zu verwenden.
%Vor%}
Sie können die Validierung über Annotation in Silverlight verwenden, anstatt ein ViewModel mit Code zu füllen.
Im Fall von speziellen Validierungsregeln können Sie benutzerdefinierte Validatoren erstellen und die Member mit [CustomValidation ...] dekorieren, was wiederum die Validierung vom ViewModel entfernt.
In jedem Fall werden die Geschäftsregeln, die Sie beschreiben, in der Regel in verschiedenen Ansichten geteilt. Eine spezielle Validierung für spezielle Fallansichten kann in Controllern hinzugefügt werden.
Im Allgemeinen: Ein ViewModel ist ein relativ dummes Objekt, das Werte für eine Ansicht enthält. Wenn Sie herausfinden, dass Sie Logik, Event-Handler und andere hinzufügen, sollten Sie wahrscheinlich ein Controller-Objekt vorstellen ... obwohl es in MVVM kein C gibt:)
Um das Modell in ViewModel verfügbar zu machen, müssen Sie Ihr Modell darauf vorbereiten, die Ansicht anzupassen. Daher sollten Sie Ihr Modell mit sichtspezifischem Code verschmutzen:
Es ist notwendig, Ihr Modell nicht mit anderen Dingen zu verschmutzen, perfektes Modell sollte minimale Abhängigkeiten mit anderen Bibliotheken haben, daher kann es in der gleichen Anwendung mit verschiedenen Plattformen geteilt werden (asp.net, mobile, mono, winform, wpf etc). Oder für Upgrade / Downgrade.
trotzdem ..
Ich habe eine kleine WPF-Anwendung erstellt (noch nicht abgeschlossen). Ich habe sie mit UnhAddins, NHibernate, Castle erstellt . Ich sage nicht, es war die beste Lösung, aber ich bin wirklich glücklich, damit zu arbeiten. Überprüfen Sie den Code zuerst, dann sehen Sie die Trennung von Entity, Validierungslogik, Business Logic. Die Assembly-Trennung wurde entwickelt, um die Abhängigkeit zwischen der Kernanwendung, der Benutzerschnittstelle und der Anwendungslogik zu minimieren.
Tags und Links silverlight mvvm