2010-01-06 21 views
5

Ich habe MVVM in letzter Zeit untersucht und ich scheine die allgemeine Idee zu bekommen. Es gibt ein paar Niggly Bits, die ich nicht vollständig verstehe und hüpfte, um ein paar Antworten hier zu bekommen, Prost!Einige MVVM Fragen (WPF C#)

  1. Ist es falsch, ein Datenmodell für die gesamte Anwendung zu verwenden? Normalerweise würde ich alle logischen Daten in einer Klasse haben, wenn ich ein kleines Dienstprogramm erstelle. Das bedeutet, ich habe kann Somethings wie folgt aus:

    DataStore myData = new DataStore; 
    
  2. Wenn es OK ist ein Datenmodell zu haben, ist es in Ordnung, mehr als eine Modellansicht zu haben, sagt ein jedes Fenster oder Ansicht, die (Dies ist, wie ich MVVM arbeiten).

  3. Wenn man dann oben sagt, wenn man mehrere Modellansichten hat, würde es scheinen, dass das Modell vor dem ersten Fenster (view) deklariert werden müsste, wo sollte es deklariert werden? Soll das Modell über einen Verweis auf nachfolgende Modellansichten weitergegeben werden? Wäre dies keine Quelle der Kopplung, da das Fenster oder die Seite (Ansicht) über das Modell wissen müsste, um es an seine Modellansicht zu übergeben, da die Ansicht die Modellansicht instanziiert.

Sorry, wenn dies eine Menge von Fragen ist, erhalte ich die Idee von MVVM in einem einzigen Fenster oder Seiten Sinne, aber sobald ich mehrere Ansichten mein System bricht down. Ich kann es mit anderen Modellen arbeiten lassen, die auf eine externe Quelle zugreifen, um ihre Daten zu erfassen, aber wenn die Daten zwischen den Ansichten bestehen bleiben müssen, verliere ich mich.

Danke an alle, die Zeit brauchen, um zu antworten!

+0

Ich möchte hinzufügen.Sollte ein Modell die Daten an eine externe Quelle senden, wenn Daten zwischen verschiedenen Modellen gespeichert werden müssen? Verschiebt das Modell Daten nur zwischen dem Speicher und der Modellansicht? – deanvmc

Antwort

5

Einige Gedanken:

  1. Einfache Anwendungen erfordern nicht notwendigerweise die Komplexität der MVVM - Sie können das Ansichtsmodell mit der Beseitigung bekommen können möglicherweise weg - und das zugrunde liegende Modell direkt verwenden. Seien Sie vorsichtig, dass Sie diesen Ansatz nicht auf den Bruchpunkt ausdehnen - da WPF sehr auf Dinge wie INotifyPropertyChanged und DependencyProperties angewiesen ist. Sie möchten diese nicht unnötig in Ihre Modellklassen einbinden.

  2. Ja, es ist in Ordnung. Allerdings ... Bedenken Sie, dass es einfacher ist, wenn es nur eine Model-Instanz gibt - andernfalls müssen Sie Änderungen aus mehreren Ansichten zusammenführen, wenn Sie speichern (oder die Änderungen einer Version verlieren). Wenn sich die ViewModels auf dasselbe zugrunde liegende Modell beziehen, kann dies praktikabel sein.

  3. Sie können ein bestimmtes Kopplungsniveau in MVVM nicht vermeiden. Allerdings, wenn ich Ihre Frage richtig verstehe, ist die Einführung der Kopplung zwischen ModelViews wahrscheinlich eine schlechte Idee - da es den Zweck vereitelt, jede einzelne Perspektive auf das Modell für eine bestimmte Ansicht optimiert zu machen.

+1

Seien Sie absolut einer Meinung: Einer der Vorteile der Datenbindungsarchitektur besteht darin, dass Sie in einer vereinfachten Modellansichtsarchitektur arbeiten und nur dann auf den komplexeren MVVM-Ansatz skalieren können, wenn Ihre Ansichten dies erfordern. Und ich würde nicht davor zurückschrecken, INotifyPropertyChanged für Ihre Modellklassen zu implementieren, um diese einfachere Architektur zu unterstützen (obwohl ich zustimme, sobald Sie damit beginnen, DPs aus dem Weg zu räumen, sind Sie wahrscheinlich im Modellgebiet angelangt). – itowlson

+0

Ja, du hast es richtig verstanden. Ich verstehe, dass ich mit der Verkürzung des Prozesses davonkommen könnte, aber ich versuche (frustrierend kann ich hinzufügen) MVVM zu lernen, bevor ich größere Apps anwende. Mein Gesamtproblem scheint Daten zwischen den Modellen zu erhalten. Vielleicht habe ich das Konzept eines Modells falsch, ich werde meinen Beitrag bearbeiten, um dies zu reflektieren. – deanvmc

+1

Sie sollten vermeiden, dass MV für die Verwaltung persistenter Daten zuständig ist. Sie sollten ihre Änderungen sofort (oder an klar definierten Punkten) in die zugrunde liegenden Modellklassen zusammenführen. Dadurch wird vermieden, dass die Persistenz zwischen verschiedenen Ansichten unterschieden werden muss. – LBushkin

1

Meine eigene Erfahrung:

  1. ich nichts falsch mit der Verwendung von einem Datenmodell für die gesamte Anwendung sehen, je nachdem, was Sie wollen, zu tun. Solange Sie es von Ihrem View getrennt halten, bleiben Sie innerhalb des MVVM Entwurfsmusters.

  2. Ich persönlich mag ein ModelView für jede meiner Ansichten. Ich denke, es gibt verschiedene Argumente dafür, aber ich persönlich denke, dass dadurch alles modularer und testbarer bleibt.

  3. Ich versuche, die Kopplung zwischen ModelViews zu vermeiden. Wenn ich eine ModelView für jede meiner Ansichten habe, deklariere ich jedes ModelView separat in jeder der Ansichten. Ich instanziiere dann jede Ansicht durch Ereignisse in meine Hauptansicht. Dies bleibt mit dem MVVM Muster, und Sie können Einheit jedes Ihrer ModelViews einzeln testen.

Ich wäre nicht überrascht, wenn Sie bereits diesen Artikel gelesen haben, aber für den Wunsch, es diejenigen aus einem Link gut hier über das MVVM Design zu lernen.

+0

Heilige Kuh, die ein dichter Artikel ist, ich werde nicht vorgeben, alles darin zu verstehen, aber es gibt mir zumindest eine Liste von Dingen zu lernen! Vielen Dank! – deanvmc

1

Ist es falsch, ein Datenmodell für die gesamte Anwendung zu verwenden. Normalerweise, wenn ich ein kleines Dienstprogramm erstellen würde ich alle logische Daten in einer Klasse haben. Diese bedeutet i Somethings wie die folgt haben:

`DataStore myData = new DataStore; ` 

Das ist in Ordnung. Ihr Datenmodell ist Ihr Datenmodell und soll die Daten in der besten Weise möglich, sei es in einer Klasse oder 1000.

darstellen Wenn es OK ist ein Datenmodell zu haben ist es in Ordnung, mehr zu haben, als ein Modell Ansicht, sagen, dass eine für jede Fenster oder Ansicht (Dies ist, wie ich Vision MVVM arbeiten).

Absolut, meiner Meinung nach ist das genau das, was Sie tun sollten. Im Allgemeinen würde ich sagen, dass Sie ein Ansichtsmodell pro Ansicht wünschen, ob eine Ansicht ein Steuerelement oder ein Fenster ist. Es kann Fälle geben, in denen Sie feststellen, dass mehr als ein Anzeigemodell für eine bestimmte Ansicht hilfreich wäre, aber ich würde zuerst sicherstellen, dass ich keine Ansicht habe, die aufgeteilt werden sollte.

oben angegebene dann, wenn man mehr Modell bietet einen Blick würde es scheinen, dass das Modell vor das ersten Fenster (Ansicht) deklariert werden müßte, wo sollte es deklariert werden? Soll das Modell über einen Verweis auf nachfolgende Modellansichten übergeben werden? Wäre dies nicht eine Quelle der Kopplung als das Fenster oder Seite (Ansicht) würde über das Modell wissen, um es an seine Modellansicht zu übergeben, da die Ansicht instanziiert das Modell anzeigen.

Jetzt betreten Sie religiöses Territorium. Ich stoße ein wenig darauf und sage, was sinnvoll für Ihre Anwendung ist. Das heißt, wenn Sie die Kopplung zwischen Ihrem Modell und Ihren Ansichten/Ansichtsmodellen reduzieren möchten, würde ich sehr empfehlen, eine Schnittstelle aus Ihren Modellklassen zu extrahieren. Es wäre ziemlich einfach, Ihr Modell in Ihrer App.xaml.cs-Datei zu erstellen und es dann als Implementierung einer Schnittstelle an die Ansicht (Modell) zu übergeben.

+0

@ Ihr letzter Punkt: Ich dachte, dass dies der am wenigsten beantwortete Teil von MVVM zu sein scheint. Die meisten Beispiele zeigen einzelne Anwendungsbeispiele, aber ich habe noch kein konkretes Beispiel für Persistenz durch Modelle gesehen. Danke, ich werde mit deinen Vorschlägen basteln! – deanvmc