WPF Caliburn.Micro/mvvm导航

WPF Caliburn.Micro/mvvm导航

问题描述:

我正在构建一个项目,直到现在我遇到的最大的问题之一就是导航。
我一直在寻找一些caliburn.micro/mvvm导航的例子,但他们似乎都很长,我不能真正了解它(初学者在这里!)。WPF Caliburn.Micro/mvvm导航

关于我的项目的一些信息:
我希望这是一个外窗/壳,与菜单链接/标签,根据按钮打开页面点击外壳的内侧部分内,并且能够打开的变化在一个页面内。

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

你也可以直接写下来,并将我链接到一些有用的例子,我相信我可以从那里继续。如果可能的话,最好得到的详细解释

在官方文档中有关于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

在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