2010-09-20 13 views
6

Hallo Kolleginnen und Stackoverflow Benutzer (oder Stackoverflowers?):WPF MVVM Doubts

Ich lerne-by-Codierung WPF. Ich las einige Artikel/sah mehrere Screencasts, und von einem Web-Entwickler Hintergrund kommen, ich Feuer und Flamme VS2010 und begann eine Beispielanwendung zu tun, dass mir die Grundlagen lernen würde helfen.

Ich las auch einige über MVVM, und begann es zu benutzen. Ich habe meine Lösung für die Verwendung von WPF 4.0, ActiveRecord 2.1 und SQLite eingerichtet, und alles lief gut. Aber ich habe noch einige Zweifel:

  • Ich habe ein MainWindowViewModel, und bin mit dem RelayCommand Klasse von here zu ... den Befehl weiterzuleiten. Bricht ich irgendwelche Richtlinien, indem ich ein MenuItem vom MainWindow habe, dessen Befehl an eine Eigenschaft dieses Viewmodels gebunden ist?

  • Diese Aktion, an die ich den MenuItem-Befehl anbinde, wird ein neues ViewModel und eine neue Ansicht instanziieren und anzeigen. Nochmal, ist das im MVVM-Kontext in Ordnung?

  • Mein Mainwindow wird eine Art „Armaturenbrett“ sein, und ich werde mehr als ein Modell zu diesem Armaturenbrett angebracht hat. Sollte ich alle diese Modelle in einem einzigen Ansichtsmodell verpacken?

Etwas wie folgt aus:

public class MainWindowViewModel { 

    private ObservableCollection<Order> openOrders; 
    private Address deliveryAddress; 
    private Order newOrder; 
    /* Wrappers for the OpenOrders Collection */ 
    /* Wrappers for Delivery Address */ 
    /* Wrappers for New Order */ 
    /* Command Bindings */ 

} 

TIA!

+0

Einige Leute bezeichnen die StackOverflow-Benutzer als Stackers –

+0

@ Eduardo, waniguchi: siehe [diese Diskussion] (http://meta.stackexchange.com/questions/6254/what-should-the-users-of-stack- Überlauf-sein genannt) auf Meta –

Antwort

6

Ich habe ein MainWindowViewModel erstellt und verwende die RelayCommand-Klasse von hier, um ... den Befehl weiterzuleiten. Breche ich alle Richtlinien, die von einem MenuItem aus dem Hauptfenster, dessen Befehl auf eine Eigenschaft dieses Viewmodels gebunden zu haben?

Nein, Sie brechen keine Richtlinie. Es ist durchaus sinnvoll, die MenuItem auf einen Befehl des MainWindowViewModel zu binden (wo sonst Sie diesen Befehl sowieso setzen würde?)

Aktion Ich Bindung des MenuItem-Befehl, um einen neuen Ansichtsmodell instanziiert wird und eine neue Sehen Sie es an und zeigen Sie es. Nochmal, ist das im MVVM-Kontext in Ordnung?

Es ist natürlich völlig in Ordnung, ein neues ViewModel zu erstellen. Wie für eine neue Ansicht erstellen, hängt davon ab, wie Sie es schaffen ... Sie sollen natürlich nie eine Ansicht explizit aus dem Viewmodel instanziiert, weil sie eine Abhängigkeit von der VM zu der Ansicht einführen würden.

Mein MainWindow wird eine Art "Dashboard" sein, und ich werde mehr als ein Modell an dieses Dashboard angeschlossen haben. Sollte ich alle diese Modelle in einem einzigen Ansichtsmodell verpacken?

Es hängt davon ab, was Sie mit „wrap“ ... Sie MainWindowViewModel andere Eigenschaften durch Viewmodel aussetzen könnten, und Thesen VMs in verschiedenen Teilen der Ansicht angezeigt werden würde. Wenn Sie das meinen, ja, sollten Sie sie einpacken.

+0

danke für Ihre Antwort. Bei der zweiten Antwort habe ich genau darüber nachgedacht, als ich die Frage gestellt habe. Angenommen, ich würde nicht explizit "new SomeView();" aufrufen, wie soll ich dann eine andere Ansicht innerhalb eines Viewmodels aufrufen? Über die dritte Antwort, würde ich die Viewmodels aussetzen muss ich für verschiedene Teile der Ansicht benötigen würde, und ein Usercontrol verwenden + ein Resource diese Art zu machen, und binden die freiliegende VM darauf? – wtaniguchi

+0

Für den zweiten Punkt verwende ich normalerweise ein ContentControl, das die entsprechende DataTemplate basierend auf dem Typ des Viewmodels auswählt. Für die 3 .: ja, genau –

+0

Ok! Vielen Dank! Ich denke, dass ich jetzt ein besseres Verständnis habe und meine Gedanken um diese Themen herum arbeiten werde! – wtaniguchi

3

Hinzufügen zur Thomas Antwort:

ich verschiedene Benutzersteuerelemente für jeden Teil des Armaturenbretts schaffen würde und ein Ansichtsmodell zu jedem Usercontrol zuordnen.

2

Ich habe ein MainWindowViewModel erstellt und verwende die RelayCommand-Klasse von hier, um ... den Befehl weiterzuleiten. Breche ich alle Richtlinien, die von einem MenuItem aus dem Hauptfenster, dessen Befehl auf eine Eigenschaft dieses Viewmodels gebunden zu haben?

Nein, das ist genau, wo Sie Befehle setzen.

Mit dieser Aktion, an die der MenuItem-Befehl gebunden ist, wird ein neues ViewModel und eine neue Ansicht instanziiert und angezeigt. Nochmal, ist das im MVVM-Kontext in Ordnung?

Es sollte nicht wissen müssen, wie man eine neue Ansicht instantiiert; Das ist die Aufgabe der Ansicht. Die Besonderheiten, wie dies zu tun, hängt davon ab, wie Sie diese neue Sicht sind zeigen - es könnte so einfach sein ein Content in der Ansicht haben, die auf eine Eigenschaft in der View-Modell gebunden ist, so dass, wenn Sie die Eigenschaft (und erhöhen Property) Der ContentPresenter rendert das neue Objekt mit dem zugehörigen DataTemplate.

Die Dinge werden ein wenig verwinkelt, wenn Sie mit "neue Ansicht instanziieren" meinen, "ein neues Fenster öffnen". Dies ist nicht besonders elegant, besonders wenn das neue Fenster ein modaler Dialog sein soll. Eine Möglichkeit besteht darin, dem Code-Behind der Ansicht einen Ereignishandler hinzuzufügen, der PropertyChanged für das Ansichtsmodell anhört. Wenn die untergeordnete Ansichtsmodelleigenschaft festgelegt wird, erstellt der Code in der Ansicht das neue Fenster und zeigt es an.

Mein MainWindow wird eine Art "Dashboard" sein, und ich werde mehr als ein Modell an dieses Dashboard angeschlossen haben. Sollte ich alle diese Modelle in einem einzigen Ansichtsmodell verpacken?

Sicher. Das ist ein sehr häufiges Muster. Es ist nicht ungewöhnlich, zum Beispiel eine beobachtbare Kollektionseigenschaft freizulegen und ein ItemsControl irgendeiner Art daran zu binden; Die Ansicht erstellt automatisch Ansichten für jedes Ansichtsmodell, das Sie in diese Sammlung einfügen. Auch hier hängt die konkrete Implementierung von Ihrer Anwendung ab.