2009-09-24 1 views
10

Wir bauen eine App mit dem MVVM-Muster, wir haben Controller, die alle Ansichten und Viewmodels mit DI verbinden. Alle Beispiele von MVVM, die ich gesehen habe, sind wirklich simpel und haben 1 Sicht. Wie sollen Viewmodels mit dem Controller sprechen? Der Controller kennt die Modelle und Ansichten, sollte das Viewmodel Ereignisse an den Controller zurücksenden? Wo sollte eine Rettung passieren? Modell? Regler?Controller in MVVM, Wie bekomme ich Informationen vom Viewmodel zum Controller?

Antwort

3

Wir verwenden auch Controller, aber in unserem Fall sind sie für den Anwendungsworkflow verantwortlich. Der Controller kennt das ViewModel und das Model, aber nicht die konkrete View, da diese vom IoC Container injiziert wird.

Wenn Sie in einem Beispiel interessiert sind, die mehr als nur eine UI (modaler Dialog, Assistent mit bedingter Workflow) zeigt dann haben Sie vielleicht einen Blick auf:

WPF Application Framework (WAF) - http://waf.codeplex.com

+1

Ja, wir machen Dinge das Gegenteil. Unser Controller kennt eine Ansichtsschnittstelle und injiziert das Ansichtsmodell und das Modell. – nportelli

5

Könnte Ihr ViewModel nicht von einem IController oder einer anderen Schnittstelle abhängig sein, damit sie darauf zurückkommen können? Ich versuche, so viel Anwendungslogik wie möglich aus dem ViewModel herauszuhalten, da diese Klassen leicht aufgebläht werden können.

Ich stimme zu, dass die MVVM-Frameworks tendenziell zu einfach mit ihren Proben sind. Vor allem, wenn ich zwischen Ansichten/Bildschirmen in Ihrer Anwendung wechsle, würde ich gerne mehr Beispiele sehen. Ich erstelle eine IViewManager-Schnittstelle, damit meine ViewModels anfordern können, dass wir in eine andere Ansicht wechseln.

+1

Nun, der Controller weiß um das Ansichtsmodell, wir geschieht nicht über eine 2-Wege-Abhängigkeit wollen oder die Chance, dass ein Ansichtsmodell von einem anderen Controller wiederverwendet wird meine. – nportelli

+1

Hmmmm, ich bin mir nicht ganz sicher, ob ich verstehe, welches Muster du verwendest. Sagen Sie, dass Sie pro Ansicht einen Controller haben? Ist das nicht mehr MVC als MVVM? Vielleicht könnten Sie Ihrer Frage ein wenig Beispielcode hinzufügen, um zu zeigen, wie Sie eine Ansicht und ein Ansichtsmodell erstellen. –

+0

Ein Controller pro Ansicht, ein Controller pro Anwendungsfall. Tut mir leid, wenn ich das nicht klar gemacht habe. – nportelli

1

Ich benutze ein ähnliches Setup für Sie. In meinem Controller, wo meine DI- und View-Injection untergeht, behalte ich manchmal den Verweis auf das ViewModel (welches die View enthält). In einigen Fällen kann ich ein Ereignis auf der VM haben, das vom Controller behandelt wird. In anderen extremen Fällen (wie wenn die VM/V außerhalb des Controllers erstellt wurde, etwa in einer anderen VM), kann ich sogar den EventAggregator (mit einem starken Verweis) verwenden, um auf Ereignisse zu warten, die auf der VM ausgelöst werden können. In diesem Fall wird ein gespeicherter Verweis auf die VM nicht benötigt.

+0

Unser Controller kennt die VM nicht. Just und Schnittstelle zur Ansicht. Die VM wird von dort injiziert. Die Idee ist, dass der Controller nichts über das Muster weiß, das die UI implementiert, sodass wir die UI leicht austauschen können. Was zu unseren Problemen führt, denke ich. – nportelli

0

Verwenden Sie Ereignisse, bei denen der Controller VM-Ereignisse abonniert oder ein Mediatormuster verwendet, bei dem ein Mediator in eine VM injiziert wird.