Ich weiß, dass Ihre Frage vor zwei Jahren gestellt wurde, aber ich würde gerne nach über einem Jahr mit MVVM arbeiten.
-1- Ich bin mir nicht sicher, was Sie fragen, aber ich denke, Sie fragen: Ist der einzige Vorteil für MVVM verbindlich? Die Antwort ist nein. Trennung von Bedenken, Bindung und effizientes Testen sind wesentliche Vorteile für MVVM. Es gibt viele kleine Vorteile, aber ich werde nicht auf diese eingehen. Das Binden ist absolut wunderbar, weil alle Synchronisationen automatisiert sind, was weniger Arbeit für Sie bedeutet. Außerdem bedeutet die Trennung von Bedenken, dass das Ansichtsmodell nicht vom Typ der Ansicht abhängt, sodass Sie mehrere Ansichten mit demselben Ansichtsmodell verwenden können. Angenommen, Sie erstellen ein Ansichtsmodell namens ErrorDataViewModel. Der Zweck dieser Klasse besteht darin, eine Liste von ErrorType-Klassen zu halten, die dem Benutzer angezeigt werden. Der ErrorType zeigt grundsätzlich Fehlerinformationen an. Das ErrorDataViewModel verfügt auch über eine boolesche Eigenschaft namens AllErrorsFixed, die dem Benutzer anzeigt, ob alle Fehler in der Liste behoben wurden. AllErrorsFixed ist eine einfache Eigenschaft, die linq verwendet, um die Liste der ErrorTypes.Fixed-Eigenschaft abzufragen. Wenn Alle fest sind, gibt AllErrorsFixed true zurück.
In Anwendung1 möchte Ihr Kunde Fehler in einer einfachen Raster-ähnlichen Weise angezeigt. Sie müssen lediglich ein Raster an die Fehlerliste dieses Ansichtsmodells binden. In Application2 möchte Ihr Kunde, dass die Fehler in einem Navigationsformat angezeigt werden, in dem sie jedes Fehlerformular per Formular anzeigen können. Alles, was Sie dann tun, ist, Ihr Formularsteuerelement an jeden Fehler in der Liste zu binden und Ihre Navigation einzurichten, um von einem Datensatz zum anderen zu wechseln. Aber warten Sie, wenn wir wollen, dass App1 sowohl eine Raster- als auch eine Form-für-Formular-Navigation verwendet, können wir das tun. Noch besser, wenn Sie jetzt eine Webschnittstelle mit Silverlight implementieren möchten, um entweder Application1/Application2 oder ein anderes Produktangebot zu ersetzen, müssen Sie das Ansichtsmodell nicht ändern. Arbeit ist erledigt.
Ich erwähnte den booleschen Wert ErrorsFixed, naja, wir haben vergessen, das in unseren Anwendungen zu implementieren. Alles, was ich tun muss, ist in meine Ansichten zu gehen, ein Steuerelement oder eine Spalte oder einen Eigenschaftentester hinzuzufügen und es an die boolesche Eigenschaft zu binden, und du bist fertig.
In Bezug auf die Prüfung können Tests effizienter sein, da Sie Testcode schreiben können Änderungen innerhalb des Viewmodel die Anwendungen laufen, ohne Zeit zu validieren und die Ansichten zu öffnen. Dies löst nicht alle Testprobleme, aber viele zeitaufwendige Schritte entfallen.
-2- Gibt es einen Vorteil für MVVM oder MVP? Ja. Ein Plakat war falsch, als er sagte, dass eine Ansicht mehrere VMs in MVVM haben kann. Tatsächlich kann eine VM mehrere Ansichten haben, da sie nicht an eine Ansicht gebunden ist. Anders gesagt, mehrere Ansichten können eine VM verwenden. In Ihrem Beispiel, in dem Sie view.ShowMessage() aufrufen, würde dies in MVVM nicht passieren, da Sie nicht garantieren können, dass die Ansicht (WPF oder Silverlight oder Testklasse) über eine ShowMessage-Methode verfügt. Stattdessen feuern Sie ein Ereignis ab. In der Tat ist Prism großartig, da es Aggregatoren für Ereignisse enthält. Wenn Sie also ein Ereignis auslösen, übernimmt der Ereignisaggregator das Senden des Ereignisses an die Ansicht, die dem Ereignis zugewiesen ist. Daher kann die Ansicht jeder App das Ereignis so handhaben, wie es für richtig erachtet wird. Mit MVP müssen Sie einen Presenter für jede Ansicht erstellen. Dies ist extrem zeitaufwendig.
-3- Ihr Beispielcode ist MVP.
Related post on SO: [http://stackoverflow.com/questions/839118/composite-guidance-for-wpf-mvvm-vs-mvp] – Marc
Ist das eine Rolle, die VM nicht beachten sollte? über eine Schnittstelle von View? – Mark
Wie wäre es, wenn ich nach dem Speichern den Fokus auf das Steuerelement legen möchte? Soll ich eine angehängte Eigenschaft zum Festlegen des Fokus erstellen? – Mark