7

我正在构建一个项目,到目前为止我遇到的最大问题之一是导航。
我一直在寻找 caliburn.micro/mvvm 导航的示例,但它们似乎都很长,我无法真正理解其中的大部分内容(这里是初学者!)。

关于我的项目的一些信息:
我希望有一个外部窗口/外壳,菜单链接/选项卡根据在外壳内部单击的按钮打开页面,并且能够从一个内部打开更改页面.

我目前有:ShellViewModel.cs、MainViewModel.cs、我的模型和我的视图。 现在,我只需要知道如何让 MainViewModel 在启动时加载到 shellviewmodel 中(使用 contentcontrol/frames ...),以及如何从一个页面移动到另一个页面。

您也可以只写点,并将我链接到一些有用的示例,我相信我可以从那里继续。如果可能的话,最好得到一个彻底的解释。

4

2 回答 2

10

在官方文档中阅读有关导体和屏幕的信息。

举个简单的例子,您ShellViewModel可以是Conductor一个活动屏幕(即一次只有一个屏幕变为活动/非活动):

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

然后,您可以将 的 设置为ActiveItemConductor希望当前处于活动状态的视图模型实例:

this.ActivateItem(myMainViewModel);

集合Conductor类型还提供了一个Items集合,您可以在实例化新窗口时填充该集合。此Items集合中的视图模型可能是当前已停用但尚未关闭的视图模型,您可以使用ActivateItem上述方法激活它们。通过ItemsControl在. x:Name="Items"_ShellView

然后,要创建ShellView,您可以使用 aContentControl并将其名称设置为与ActiveItem属性相同,然后 Caliburn.Micro 将完成剩下的工作:

<ContentControl x:Name="ActiveItem" />

然后,您可以MainViewModel通过覆盖该类中的OnActivate/来响应您的激活/停用。OnDeactivate

于 2013-05-14T14:26:30.443 回答
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>

外壳视图模型:

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通过您的 ShellViewModel 绑定View.ModelChild属性。

在 ShellView 中,我使用了一个按钮来显示不同的视图,但您也可以使用菜单或类似的东西。

于 2013-05-14T14:35:27.087 回答