2010-04-19 7 views
6

Ich habe folgende Frage in Bezug auf MVVM Licht: Was "fährt" die Benutzeroberfläche? Ich sehe, dass ich ein ViewModel pro View haben kann, das ich zeige; Der ViewLocator behandelt alle ViewModels (zum Caching wie ich es verstehe). Aber was treibt die Benutzeroberfläche an?Benötige ich einen View Controller für MVVM-Licht in Silverlight?

Wenn ich ein Command in meinem ViewModel definiert habe, das sagt "ShowDetail"; muss ich den Code zum Anzeigen dieser Ansicht im ViewModel schreiben?

Gibt es Beispiele dafür? Vielen Dank!

Antwort

1

In MVVM "treibt" die Ansicht die Datenbindung an. Sie können die Ansicht mit dem ViewModel verbinden, indem Sie den DataContext der View so einstellen, dass er auf das Ansichtsmodell zeigt.

Einfaches Beispiel (mit MVVM Light):

MyViewModel.cs

public class MyViewModel : ViewModelBase 
{ 
    (...) 
    private string _myProperty; 
    public string MyProperty { 
     get { return _myProperty; } 
     set { 
      _myProperty = value; 
      RaisePropertyChanged("MyProperty"); 
     } 
    } 
} 

MyView.xaml.cs

void MyView() { 
    DataContext = new MyViewModel(); 
} 

MyView.xaml

<TextBlock Text="{Binding MyProperty}" /> 
+1

Meine Fragen bezog sich mehr auf das Laden verschiedener Ansichten. Ich verstehe den Bindungsmechanismus mit einem ViewModel. Aber wo schreibe ich Code, um eine neue Ansicht anzuzeigen, wenn der Benutzer zum Beispiel die Schaltfläche "Details anzeigen" ausführt? –

5

Die MVVM Muster an sich nicht ha etwas Spezifisches für die Navigation zwischen den Ansichten. Dafür gibt es in mehreren Frameworks viele Lösungen. Die gebräuchlichste Lösung besteht darin, eine Art Controller zu verwenden, der die Hauptansicht "orchestriert", oder einen "Master-Detail" -Ansatz für Unteransichten zu verwenden.

Einige interessante Lösungen:

1

Ich habe eine T4-Vorlage tha erstellt t erzeugt Code und zeigt an, wie man zu einem uri oder Objekt navigiert oder ein Fenster schließt (wpf). Es arbeitet mit mvvm Licht

Download here

0

Ich glaube, Sie Cinch V2 austesten sollte:

http://www.codeproject.com/KB/WPF/CinchV2_1.aspx

, die viel versprechende ruhig zu sein scheint. Ich denke jedoch, dass die meisten dieser Rahmenbedingungen ziemlich schwierig sind.

Ich implementierte eine Lösung mit einem einfachen MVVM-Ansatz mit einer Art Überwachungsmuster, das die Kommunikation zwischen Views und View-Models regelt.

0

Ich würde empfehlen, dass Sie auf dem Messaging-System im MVVM Light Toolkit nachlesen. Dies scheint der einfachste Ansatz zu sein, den ich gefunden habe, um dies zu erreichen.Hier ist ein Beispiel dafür, wie es funktioniert:

Wenn Sie 2 Ansicht Modelle haben - 1 für die Suche Kunden, die andere für die Anzeige Details über die ausgewählten Kunden:

Im ersten Blick Modell haben Sie eine Eigenschaft wie dies:

public string CustomerID 
    { 
     get 
     { 
      return _customerid; 
     } 

     set 
     { 
      if (_efolderid == value) 
      { 
       return; 
      } 

      var oldValue = _customerid; 
      _customerid = value; 

      // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging 
      RaisePropertyChanged("CustomerID", oldValue, value, true); 
     } 
    } 

Dann in der zweiten Ansicht Modell, registrieren Sie Nachrichten zu empfangen, wenn sich dieser Wert ändert sich von der anderen Seite, wie folgt aus:

void registerForMessages() 
    { 
     Messenger.Default.Register<PropertyChangedMessage<string>>(this, 
      (pcm) => 
      { 
       if (pcm.PropertyName == "CustomerID") 
       { 
        customerID = pcm.NewValue; 
        AddWorkplanCommand.RaiseCanExecuteChanged(); 
        loadCustomerDetails(); 
       } 
      }); 
    } 

Be Sicher, dass Sie die Funktion registerForMessages() im Konstruktor des zweiten Ansichtsmodells aufrufen. Eine andere Sache, die hilft, ist eine Karte der Art zu erstellen, wenn Sie 4 oder mehr ViewModels in Ihrer Anwendung haben. Ich finde es einfach, einen in einer schnellen Textdatei in der Lösung zu konstruieren, um alle Nachrichten zu verfolgen und was sie erreichen sollen und welche anderen Ansichtsmodelle registriert sind, um sie zu empfangen.

Eines der wirklich schönen Dinge über das ist, dass Sie 1 Änderungsmodell haben, senden Sie eine Änderungsbenachrichtigung, wie die customerID -Eigenschaft geändert, und sofort haben 4 andere Viewmodels erhalten diese Änderung und alle beginnen, Änderungen selbst zu laden.