2013-05-14 155 views
7

我正在構建一個項目,直到現在我遇到的最大的問題之一就是導航。
我一直在尋找一些caliburn.micro/mvvm導航的例子,但他們似乎都很長,我不能真正瞭解它(初學者在這裏!)。WPF Caliburn.Micro/mvvm導航

關於我的項目的一些信息:
我希望這是一個外窗/殼,與菜單鏈接/標籤,根據按鈕打開頁面點擊外殼的內側部分內,並且能夠打開的變化在一個頁面內。

我目前有:ShellViewModel.cs,MainViewModel.cs,我的模型和我的看法。 現在,我需要知道的是如何在啓動時使用shellviewmodel加載MainViewModel(使用contentcontrol/frames ...),以及如何從一個頁面移動到另一個頁面。

你也可以直接寫下來,並將我鏈接到一些有用的例子,我相信我可以從那裏繼續。如果可能的話,最好得到的詳細解釋

回答

10

在官方文檔中有關於Conductors and Screens的閱讀。

舉一個簡單的例子,你ShellViewModel可能是一個Conductor活動畫面(即只有一個屏幕變成有效/無效在時間):

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

然後,您可以設置ConductorActiveItem到您希望視圖模型的實例是當前活動:

this.ActivateItem(myMainViewModel); 

集合Conductor型還提供了一個Items集合,你可以填充當你實例化新的窗口。此Items集合中的視圖模型可能是當前已停用但尚未關閉的視圖,您可以使用上述的ActivateItem激活它們。通過在ShellView中使用ItemsControlx:Name="Items",還可以非常容易地創建打開窗口菜單。

然後,創建ShellView,您可以使用ContentControl,並設置它的名字是一樣的ActiveItem財產,Caliburn.Micro將做休息:

<ContentControl x:Name="ActiveItem" /> 

然後,您可以迴應通過在該類中重寫OnActivate/OnDeactivate來激活/禁用您的MainViewModel

+0

那麼,你絕對簡化了這個想法! 是一個集合'Conductor'類型的東西,當我想添加「向後」/「向前」的功能,例如我應該使用? 另外,如何去按鈕上的另一個頁面點擊?我只是使用命令?如果是這樣,EventAggerator在大多數其他示例中使用的地方會派上用場? – Asaf 2013-05-14 14:51:07

+0

無論您使用導體還是其中一個導體,導體將取決於您希望關閉前一個/下一個屏幕還是僅停用。要轉到另一個頁面,您只需調用ActivateItem方法。查看文檔頁面上的Actions以從視圖調用視圖模型中的方法。 – devdigital 2013-05-14 15:09:13

+0

謝謝。您能否告訴我如何在另一個視圖模型中將當前活動視圖更改爲另一視圖模型(例如,使用OldVieModel更改爲NewViewModel) – Asaf 2013-05-18 12:40:08

4

在ShellView您使用的內容控制是這樣的:

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

所以這是一個非常簡單的例子。但正如你所看到的,你的ShellView提供了一個ContentControl,它顯示了子視圖。此ContentControl通過View.Model綁定到您的ShellViewModel的Child屬性。

在ShellView中,我使用了一個按鈕來顯示不同的視圖,但您也可以使用菜單或類似的東西。

+0

你應該爲了清楚聲明你的'孩子'實例是一些基本的'ViewModel'類型,如'PropertyChangedBase'或'Screen'... – EluciusFTW 2015-12-25 23:51:24