ViewModels in ViewModelLocator MVVM Light
Ist es richtig, speichern alle meine ViewModels in SimpleIoc? Zum Beispiel bin ich mit drei Seiten Hauptseite, Fotos, Verzeichnisse (also drei ViewModels -> MainVM, PhotosVM, DirectoriesVM). Sollte ich DataContext in jede Seite ein, um Modell-Eigenschaft in ViewModelLocator oder nest ViewModels als Eigenschaften in MainVM und binden jede Seite DataContext auf Main.PhotosVMProperty Main.DirectoriesVMProperty und so weiter? Könnte jemand mir erklären Idee und Zweck des IoC ?
InformationsquelleAutor der Frage fex | 2013-01-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst lässt Blick auf, was ViewModelLocator tut und warum wir Sie verwenden:
ViewModelLocator als ein Objekt deklariert ist auf unserer App.xaml-Seite und ist eine Anwendung des singleton. Wir haben eine und nur eine von Ihnen zur Verfügung, um die Anwendung, wenn es ausgeführt wird.
ViewModelLocator ist die Quelle für alle unsere ViewModels in MVVM Light. Für jede ViewModel wir haben ein Grundstück auf der ViewModelLocator, die es uns erlaubt, ein ViewModel für einen Blick. Dieser code sieht wie folgt aus:
Dies ist ein Stück von meiner App.xaml:
Dies ist ein Stück aus dem Blickfeld.xaml
So weit So gut. Zur Beantwortung Ihrer ersten Frage, Sie haben zu verwenden Ioc im MVVM-Light? Nein. Es gibt keine Notwendigkeit, wie Ihr viewmodel gegeben werden, um Ihre Ansicht vollständig aufgebaut, und instanziiert die ViewModelLocator.
Nun, auf Ihre zweite Frage: Was ist der Sinn des IoC?
IoC ist so konzipiert, ermöglichen es Ihnen, Folgendes zu tun:
Mvvm Light man so:
Wenn ich löse meine MainViewModel, wenn ich rufe
was intern passiert, ist, dass die SimpleIoc überprüft, um zu sehen, ob das MainViewModel irgendwelche Abhängigkeiten hat (Parameter im Konstruktor). Es wird dann versucht, zu lösen, diese Parameter durch die Betrachtung der Schnittstellen, die registriert wurden. Dies geschieht rekursiv, so dass, wenn DataService hatte eine Abhängigkeit, es wäre instanziiert und an die DataService-Konstruktor, wenn es instanziiert wird als gut.
Warum würde ich tun, all diese Arbeit?
ViewModelBase.IsInDesignModeStatic
), dies bedeutet, dass Sie erstellen können, die die design-time-services, um Ihre viewmodels Daten, so dass Sie Ihre Ansicht in Visual Studio enthält die tatsächlichen Daten.InformationsquelleAutor der Antwort Faster Solutions
MVVM Light hat eine Menge nette features, aber es scheint mir, dass der Service Locator erzeugt unerwünschte Abhängigkeit von der Aussicht auf die Modelle ansehen. Im Idealfall würde ich gerne die ViewModelLocator in der Bibliothek Ein, die das anzeigen von Modellen in Bibliothek B und die Ansichten in der Bibliothek C. Dann kann ich mischen und anzupassen diese als notwendig für zukünftige Projekte. Jedoch, in der Gestaltung von MVVM Light, soweit ich sehen kann, sind die Ansichten (Bibliothek C) haben immer eine Abhängigkeit von der ViewModelLocator (das ist okay), sondern weil die ViewModelLocator (Bibliothek A) wird immer eine Abhängigkeit der Modelle ansehen (Bibliothek B), dann die Aussicht wird immer davon abhängen, die Modelle ansehen (das ist nicht okay, weil nun eine Ansicht gehören alle der Ansicht Modell-Bibliotheken war es jemals verwendet in allen Produkten).
Ich glaube, dass Prism umgeht dieses problem durch die Verwendung von string-Schlüssel irgendwie. Bin ich etwas fehlt?
Oops! Ich glaube, ich habe gerade meine Frage selbst beantwortet. Die Lösung ist, um Eine Bibliothek, die ServiceLocator, die spezifisch für eine bestimmte Lösung (Produkt). Es enthält dann eine Referenz auf den view-Modelle nur für diese Lösung. Dann die Ansichten abhängen ServiceLocator das wiederum hängt davon ab, alle Modelle anzeigen für das Produkt. Das Endergebnis ist, dass die Ansichten hängt nur von der Aussicht auf Modelle, die es verwendet wird, für das Produkt. Es ist kein problem mit dir, dass wir das duplizieren der ServiceLocator für jede Lösung, da dieses Modul enthält nur code, der spezifisch für die Lösung. Die Komponenten des ServiceLocator wie die SimpleIoc Klasse sind, natürlich, um gemeinsame Lösungen, diese wurden jedoch ausgeklammert in wiederverwendbare Klassen, die rufen wir in ServiceLocator.
Zusammenzufassen, die Dinge, das problem versuche ich zu lösen, wird angenommen, dass eine Lösung hat 6 Modelle, von denen vier sind eng miteinander verbunden, und zwei von denen sind eng miteinander verbunden. Daher legen wir zwei Baugruppen, die jeweils mit den eng verwandten Modelle ansehen. Nehmen wir an, wir entwickeln ein Produkt, das mit einer Reihe von view-models und die Lösung wurde für die Ausführung von Windows 8. Nun, die Ansichten sind alle Verschieden, und wir wollen re-verwenden Sie nur ein set (Montage) von view models. Also wir erstellen Sie einfach einen neuen ServiceLocator-assembly, die Punkte für die Montage der Modelle ansehen und auch alle anderen, die wir brauchen. Unsere neue Windows 8-Ansichten hängt jetzt auf diese neue ServiceLocator Montage-und nur die Modelle anzeigen, die verwendet werden, in unserem neuen Produkt (Lösung).
InformationsquelleAutor der Antwort Richard