2011-01-15 4 views
2

Ich habe eine WPF-Anwendung, wo ich das MVVM-Muster verwende.WPF/MVVM - ViewModels in der Anwendungskomponente behalten oder trennen?

Ich lasse die VM für Aktionen aktivieren, die Benutzereingaben erfordern und daher Aufrufe von der VM aktivieren müssen.

Ich habe angefangen, die VMs in eine separate Komponente/Assembly zu trennen, teilweise weil ich sie als testbaren Teil der Einheit sehe, teilweise weil Ansichten sich auf VM verlassen sollten, nicht umgekehrt. Aber wenn ich dann ein Fenster aufrufen muss, ist das Fenster der VM nicht bekannt.

Alle Einführungen finde ich die VM in der WPF/App-Komponente und damit das Problem beseitigt.

Dieser Artikel empfiehlt sie in getrennten Schichten zu halten: http://waf.codeplex.com/wikipage?title=Architecture%20-%20Get%20The%20Big%20Picture&referringTitle=Home

Wie ich es sehe, ich habe folgende Möglichkeiten

  1. Verschieben von VMs auf die WPF/App Montage VMs zu ermöglichen, die Fenster für den Zugriff auf direkt.

  2. Platzieren Sie Schnittstellen von Ansichten in der VM-Assembly, implementieren Sie Ansichten in der WPF/App-Assembly und registrieren Sie die Verbindung über IOC oder auf andere Arten.

  3. Datei ein 'Antrag' von der VM in einen Mechanismus/Bus, leitet die Anforderung (aber welcher Mechanismus !? Z. B etwas in Prism ?!)

Was ist die Empfehlung?

Vielen Dank für alle Kommentare,

Anders, Dänemark

Antwort

2

nicht Option 1. Pflücken Sie werden Sie eine unerwünschte Abhängigkeit von VM V.

sind

Optionen 2 und 3 das Hinzufügen beide gültig und verwendet werden. Das Pflücken zwischen diesen ist manchmal eine Frage des Geschmacks. Ich denke, dass IOC ermöglicht/besser spottet, während ein Messagebus für kleine Anwendungen gut funktioniert.

+0

Interessant - Ich habe nie einen Nachrichtenbus für so etwas verwendet, aber hätte gedacht, dass es für größere Systeme war? Für den Rest, Punkte genommen, und danke! –

+0

Es kann eine einfache Klasse sein, die nach Nachrichten horcht und weiß, wohin sie gesendet werden soll (Publisher/Subscriber-Muster). Sie müssen vorsichtig sein, da sie verhindern, dass Ansichten gesammelt werden, wenn Sie Referenzen auf sie im Bus speichern. Einige schlagen vor, schwache Referenzen zu verwenden, um das zu lösen. –

+0

Hallo, Es ist ziemlich eine Krawatte, welche Antwort zu wählen. Ich endete mit Prism.EventAggregator, um Dinge zusammen zu binden. Danke Erno –

0

Halten Sie Ihre ViewModels in einer separaten Assembly von den Ansichten.

Wenn Sie in Cinch und MEFedMVVM schauen, sehen Sie eine sehr leistungsfähige Mechanismen zum Verbinden von Ansichten und Viewmodels mit MEF. Indem Sie sie getrennt halten, können Sie Ihre Anwendung kopflos (ohne Benutzeroberfläche) ausführen, was sich hervorragend zum Testen und Freigeben einer API eignet.

+0

Ich endete mit Prism.EventAggregator, um Dinge zusammen zu binden. Danke Zamboni –