Ich kämpfe darum, die MVVM-Architektur zu verstehen

7

Ich versuche, MVVM und WPF zu lernen und verwende das MVVM Light Toolkit. Hier ist, was ich nicht vollständig verstehe und vielleicht liegt es an einer falschen Architektur meiner Benutzeroberfläche.

Was ich versuche zu erreichen, ist eigentlich ziemlich einfach. Dies ist übrigens eine Utility-Anwendung. Ich möchte ein Fenster, das sozusagen als "Controller" dient und über eine Reihe von Schaltflächen verfügt. Jede Schaltfläche sollte den Inhalt eines Rahmens ändern. Beispiel: Eine Schaltfläche lädt einen "Bildschirm" (oder eine "Ansicht", wenn Sie so wollen), mit dem der Benutzer eine "Agentur" konfigurieren kann, bei der es sich um ein benutzerdefiniertes Objekt handelt. Ein weiterer Knopf lädt eine Liste von Benutzern von der Agentur, die auf dem ersten "Bildschirm" war. Diese Ansicht 'Benutzer' muss ebenfalls in denselben Frame geladen werden. Tatsächlich ist das Fenster mit allen Tasten tatsächlich nur dafür verantwortlich, die "Bildschirme" in den Rahmen zu laden. Das Fleisch der Anwendung wird innerhalb aller separaten "Bildschirme" sein

Was ich nicht verstehe, ist 1) wie man jeden Bildschirm / jede Ansicht voneinander kennt, da man von dem anderen abhängig ist. Es scheint, dass das ViewModel in MVVM nichts wissen sollte. Aber in meinem Fall muss ich Informationen weitergeben (wie meine Agentur).

Wenn ich ein paar Hinweise darauf bekommen könnte, was ich untersuchen muss, wäre das großartig.

Danke!

    
ABR 16.11.2011, 18:43
quelle

4 Antworten

13

Einige Ideen, die einige der Punkte verbinden könnten:

  • Sie werden wahrscheinlich ein Viewmodel pro Ansicht ("screen") haben.
  • Jedes Ansichtsmodell enthält die gesamte Logik für die entsprechende Ansicht
  • Viewmodels können und werden über die Models (Agency, Users)
  • Bescheid wissen
  • Viewmodels können über den Messenger in MVVM Light miteinander kommunizieren
  • Denken Sie an den Messenger von MVVM Light als "anwendungsweites Eventing-System". Wenn Sie eine Nachricht aus einem Ansichtsmodell senden, kann jedes andere Ansichtsmodell auf diese Nachricht / dieses Ereignis warten und bei Bedarf darauf reagieren.

Hilft das überhaupt? Lass deine Gedanken kommen und ich werde weiter kommentieren und ich bin mir sicher, die Gemeinde wird das auch tun:)

    
Kendrick 16.11.2011 18:55
quelle
4

Wenige Dinge:

  • jeder deiner Bildschirme sollte eine separate Ansicht sein (zB Benutzerkontrolle oder neues Fenster - ich nehme an, du hast das schon gemacht)
  • jeder Teil des Modells (z. B. Agentur, Benutzer), den Sie in Ihrer Anwendung anzeigen möchten, sollte mit seinem speziellen Ansichtsmodell
  • umschlossen werden
  • Ihre Ansichten müssen nicht wirklich voneinander wissen; Sie können Befehle oder Ereignisse in Ansichtsmodellen verwenden, um diese Abhängigkeiten loszuwerden
  • View-Modell muss nur über one wissen: Modell, auf dem es basiert
  • Es ist gut, über die Ansicht als wirklich einfache Klasse nachzudenken, mit einer einzigen Verantwortung, Inhalte zu rendern; keine Logik, kein Code dahinter (außer es ist nur UI / Display-bezogen) ist etwas zu folgen

Sie können zuerst versuchen, Ihre Modelle vorzubereiten (wenn Sie dies noch nicht getan haben) und dann Ansichtsmodelle für sie erstellen (denken Sie daran, welche Eigenschaften von Modellen für Ansichten verfügbar gemacht werden sollen) und sobald diese fertig ist, bauen Sie Ihre Ansichten auf Modelle ansehen. Andersherum ist auch praktikable Option - wählen Sie, was auch immer für Sie natürlicher fühlt.

Noch eine Sache: Da Sie erwähnt haben, dass Sie mehrere Bildschirme in einem (ich nehme an) Hauptbereich anzeigen können, denken Sie darüber nach, Ihre Ansichtsmodelle mit etwas in der Art bool IsCurrentlyActive Eigenschaft auszustatten. Auf diese Weise können Sie Ansichten einfach mit Schaltflächenklicks anzeigen und ausblenden und trotzdem den Bindungsmechanismus verwenden.

    
k.m 16.11.2011 19:01
quelle
2

Sie sollten nicht voneinander wissen. Das ist, was der Messenger für Controller und Ansichten ist, die die Ereignisse abonnieren, an denen sie interessiert sind. Auf diese Weise müssen sie nicht wissen oder sich darum kümmern, woher sie stammen.

Hmm Kendrick ist schneller. Was er sagte.

Es klingt auch so, als ob Sie eine Art von Outlook-Schnittstelle wünschen, eine Navigation, die andere Ansichten lädt. Ich hatte die gleiche Frage vor einer Weile. Wie funktioniert es in WPF ohne Prisma?

>     
nportelli 16.11.2011 19:01
quelle
1

Um das MVVM-Muster besser zu verstehen, sehen Sie sich diesen Artikel an: WPF-Apps mit dem Model-View-ViewModel-Design Muster

Ich rate Ihnen auch, sich das Caliburn Micro -Rahmenwerk anzuschauen.

    
Andrii Startsev 16.11.2011 19:06
quelle

Tags und Links