2013-05-14 12 views
7

Buduję projekt, a jednym z największych problemów, na jakie natrafiłem, jest nawigacja.
Od jakiegoś czasu szukam przykładów nawigacji caliburn.micro/mvvm, ale wszystkie wydają się naprawdę długie i nie mogłem tego zrozumieć (początkujący!).Nawigacja WPF Caliburn.Micro/mvvm

Kilka informacji o moim projekcie:
Chcę, aby istniało zewnętrzne okno/skorupa, z łączami/zakładkami menu, które otwierają strony zgodnie z przyciskiem klikniętym wewnątrz wewnętrznej części skorupy, i mogą otwierać zmiany strona z jednego.

Obecnie mam: ShellViewModel.cs, MainViewModel.cs, moje modele i moje widoki. Na razie wszystko, co muszę wiedzieć, to jak ładować MainViewModel wewnątrz powłoki shellviewmodel przy uruchomieniu (używając contentcontrol/frames ...) i jak przejść z jednej strony na drugą.

Można również po prostu napisać to w punktach i połączyć z kilkoma przydatnymi przykładami, i uważam, że mogę kontynuować. Najlepiej uzyskać dokładne wyjaśnienie rzeczy , jeśli to możliwe,.

Odpowiedz

10

Czytanie o Conductors and Screens na oficjalnej dokumentacji.

Jako prosty przykład, ShellViewModel może być Conductor o jeden aktywny ekran (czyli tylko jeden ekran staje się aktywny/nieaktywny w czasie):

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

Następnie można ustawić ActiveItem z Conductor do instancja widok model, który chcesz być aktywna:

this.ActivateItem(myMainViewModel); 

kolekcja Conductor typu zapewnia również Items kolekcję które można zapełnić podczas tworzenia nowych okien. Viewmodels w tej kolekcji Items mogą być tymi, które są obecnie dezaktywowane, ale jeszcze nie zamknięte, i możesz je aktywować, używając powyższej metody, używając ActivateItem. Ułatwia również tworzenie menu otwartych okien za pomocą ItemsControl z x:Name="Items" w swoim .

Następnie, aby utworzyć ShellView, można użyć ContentControl i ustawić jego nazwę na takie same jak właściwości ActiveItem i Caliburn.Micro zrobi resztę:

<ContentControl x:Name="ActiveItem" /> 

Można wtedy reagowania na aktywacja/dezaktywacja w twoim MainViewModel przez przesłonięcie w tej klasie OnActivate///.

+0

Cóż, zdecydowanie uprościłeś pomysł! Czy w kolekcji 'Conductor' jest coś, co powinienem użyć, gdy chcę np. Dodać funkcję" wstecz "/" do przodu "? Co zrobić, aby przejść do innej strony po kliknięciu przycisku? Czy po prostu używam poleceń? Jeśli tak, gdzie przydatna jest funkcja EventAggerator zastosowana w większości innych przykładów? – Asaf

+0

Niezależnie od tego, czy używasz Dyrygenta, czy jednego z jego elementów Przewody będą zależały od tego, czy chcesz zamknąć lub zamknąć ekrany prev/next. Aby przejść do innej strony, wystarczy wywołać metodę ActivateItem. Rzuć okiem na Akcje na stronach dokumentacji, aby wywołać metody z twoich wizualizacji z twoich widoków. – devdigital

+0

Dzięki. Czy mógłbyś mi powiedzieć, jak mogę zmienić bieżący widok aktywny na inny w innym modelu widoku (na przykład zmieniając na NewViewModel na OldVieModel). – Asaf

4

W ShellView użyć kontrolę zawartości takiego:

<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(); 
    } 
} 

więc jest to bardzo prosty przykład. Ale jak widzisz, twój ShellView zapewnia ContentControl, który pokazuje widok podrzędny. Ta ContentControl jest powiązana poprzez View.Model z właściwością Child ze swojego ShellViewModel.

W narzędziu ShellView użyłem przycisku, aby wyświetlić inny widok, ale można również użyć menu lub czegoś podobnego.

+0

Powinieneś dla jasności zadeklarować, że twoja instancja "Child" ma jakiś podstawowy typ "ViewModel", np. "PropertyChangedBase" lub "Screen" ... – EluciusFTW