ich bau grad eine Anwendung mit MVVM und WPF. Das UI besteht aus einem Hauptformular und mehreren Dialogforumularen, die modal angezeigt werden und Details der Daten aus dem Hauptformular zum Editieren bereitstellen. Jetzt fragte ich mich, was wohl best practices ist, wie man das ViewModel aufbaut: - eine Klasse, die das ViewModel für alle Dialoge bietet oder - für jedes Formular eine Klasse.
Was ist an meiner Antwort falsch? Die Abschnitte "ViewModel Class Hierarchy" und "The Data Model and Repository" zeigen die gefragten best practices. Man sollte sich vor dem Voten die Seite genau ansehen :-P
Der Artikel scheint mir auch sehr gut zu sein. Er zeigt eine ganz andere Sichtweise auf Views, ViewModels etc. Dass selbst die einzelnen "Child Windows" als reine Datenobjekte existieren - interessant und für jemanden, der von WinForms kommt überraschend.
Erstmal: Der von Martin Fuchs gepostete Link ist hervorragend für die Einarbeitung in MVVM. Daher verstehe ich den derzeitigen Minuspunkt nicht. Das werde ich gleich nach Absenden meiner Antwort korrigieren.
Zur Frage:
Eine Klasse für alle Dialoge ist nicht gut. Ob man generell für jede Maske (Window) ein eigenes Viewmodel benötigt, kann man so nicht sagen, besser ist man assoziiert ein ViewModel mit einer View (bei mir ein UserControl), und baut daraus seine Masken (Windows) zusammen.
Ich baue meine Anwendungen so auf (Elemente reduziert auf die Fragestellung):
Services: - Model Klassen, die u. U. von einer gemeinsamen Basisklasse ableiten und IDataErrorInfo implementieren. - Repository Klassen, eine für jedes Model, u. U. auch hier gemeinsame Basisklasse.
WPF Client: - Views (= User Controls), die genau eine spezielle Ansicht für genau ein Model Objekt abbilden, und zwar durch ein - ViewModel, das der View zugeordnet wird (über DataTemplates) - Windows, die ein oder mehrere Views - je nach Anforderung - enthalten.
Da sich viele Funktionalitäten wiederholen habe ich abstrakte Generic Basisklassen eingeführt, die die gemeinsamen Funktionalitäten (z. B. CanSave Property, ItemChanged Event, IsSelected Property für Listenansichten etc., gemeinsame Commands) abbilden.
Die Abschnitte "ViewModel Class Hierarchy" und "The Data Model and Repository" zeigen die gefragten best practices. Man sollte sich vor dem Voten die Seite genau ansehen :-P