2013-05-14 25 views
7

Ich baue ein Projekt, und eines der größten Probleme, die mir bisher begegnet sind, ist die Navigation.
Ich habe schon seit einiger Zeit nach Beispielen für caliburn.micro/mvvm Navigation gesucht, aber sie scheinen alle sehr lang zu sein und ich konnte nicht wirklich viel davon verstehen (Anfänger hier!).WPF Caliburn.Micro/mvvm Navigation

Einige Informationen über mein Projekt:
Ich möchte dort ein äußeres Fenster/Shell, mit Menü-Links/Tabs sein, dass offene Seiten nach der Taste innerhalb eines inneren Teil der Schale angeklickt wird, und in der Lage sein Wechsel zu öffnen die Seite aus einer Eins.

Ich habe derzeit: ShellViewModel.cs, MainViewModel.cs, meine Modelle und meine Ansichten. Für jetzt, alles, was ich wissen muss ist, wie man MainViewModel laden in shellviewmodel beim Start (mit contentcontrol/frames ...), und wie man von einer Seite zu einer anderen.

Sie könnten auch einfach in Punkte schreiben, und mich mit ein paar nützlichen Beispielen verbinden, und ich glaube, ich könnte von dort weitermachen. Es wäre am besten, eine gründliche Erklärung der Sachen zu bekommen, wenn möglich.

Antwort

10

Lesen Sie über Conductors and Screens auf der offiziellen Dokumentation.

Als einfaches Beispiel, Ihren ShellViewModel ein Conductor ein aktiver Bildschirm sein könnte (dh nur ein Bildschirm wird aktiv/inaktiv zu einem Zeitpunkt):

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive 

Sie dann die ActiveItem der Conductor kann festlegen, die Ansicht Modell Instanz, die Sie zur Zeit aktiv sein wollen:

this.ActivateItem(myMainViewModel); 

eine Sammlung Conductor Art stellt auch eine Items Sammlung, die Sie füllen können wie Sie neue Fenster instanziieren. Viewmodels in dieser Items Auflistung können diejenigen sein, die derzeit deaktiviert, aber noch nicht geschlossen sind, und Sie können sie wie oben unter Verwendung von ActivateItem aktivieren. Es macht es auch sehr einfach, ein Menü von offenen Fenstern zu erstellen, indem Sie eine ItemsControl mit x:Name="Items" in Ihrem ShellView verwenden.

Dann erstellen die ShellView Sie eine ContentControl und setzen Sie den Namen der gleiche wie der ActiveItem Eigenschaft sein können, und Caliburn.Micro erledigt den Rest:

<ContentControl x:Name="ActiveItem" /> 

Sie können dann antworten Aktivierung/Deaktivierung in Ihrer MainViewModel durch Überschreiben OnActivate/OnDeactivate in dieser Klasse.

+0

Nun, Sie haben die Idee definitiv vereinfacht! Ist eine Sammlung 'Conductor' Typ etwas, das ich verwenden sollte, wenn ich zum Beispiel" rückwärts "/" weiterleiten "-Funktion hinzufügen möchte? Wie gehe ich bei einem Klick auf eine andere Seite? Benutze ich Befehle? Wenn ja, wo kommt der EventAggerator in den meisten anderen Beispielen zum Einsatz? – Asaf

+0

Ob Sie den Conductor oder einen der Collector Conductors verwenden, hängt davon ab, ob Sie Ihre vorherigen/nächsten Bildschirme schließen oder nur deaktivieren möchten. Um zu einer anderen Seite zu gelangen, rufen Sie einfach die ActivateItem-Methode auf. Sehen Sie sich die Aktionen auf den Dokumentationsseiten zum Aufrufen von Methoden in Ihren Ansichtsmodellen in Ihren Ansichten an. – devdigital

+0

Danke. Könnten Sie mir bitte sagen, wie ich die aktuelle aktive Ansicht in einem anderen Ansichtsmodell ändern kann (z. B. von OldVieModel in NewViewModel wechseln). – Asaf

4

In ShellView verwenden Sie eine Inhaltskontrolle wie folgt aus:

<ShellView xmlns:cal="http://caliburnproject.org/"> 
    <StackPanel> 
      <Button Content="Show other view" cal:Message.Attach="ShowOtherView" /> 
      <ContentControl cal:View.Model="{Binding Child}" /> 
    </StackPanel> 
</ShellView> 

ShellViewModel:

public class ShellViewModel : Screen 
{ 
    private object Child; 

    public object Child 
    { 
      get{ return child; } 
      set 
      { 
       if(child == value) 
        return; 
       child = value; 
       NotifyOfPropertyChange(() => Child); 
      } 
    } 

    public ShellViewModel() 
    { 
     this.Child = new MainViewModel(); 
    } 

    public void ShowOtherView() 
    { 
      this.Child = new FooViewModel(); 
    } 
} 

Das ist also ein sehr einfaches Beispiel. Aber wie Sie sehen, bietet Ihr ShellView eine ContentControl, die die untergeordnete Ansicht zeigt. Diese ContentControl ist über View.Model an die Child-Eigenschaft von Ihrem ShellViewModel gebunden.

In ShellView habe ich eine Schaltfläche verwendet, um eine andere Ansicht anzuzeigen, aber Sie können auch ein Menü oder etwas ähnliches verwenden.

+0

Sie sollten der Klarheit halber Ihre "Child" -Instanz als Basis eines "ViewModel" -Typs deklarieren, wie "PropertyChangedBase" oder "Screen" ... – EluciusFTW