WPF这份原稿.微/ mvvm导航

本文关键字:mvvm 导航 WPF | 更新日期: 2023-09-27 18:13:23

我正在构建一个项目,到目前为止我遇到的最大问题之一是导航。
我一直在寻找一段时间的例子,现在的口径。微/mvvm导航,但他们似乎都很长,我不能真正理解其中的大部分(初学者这里!)。

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

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

你也可以把它写成点,并给我一些有用的例子,我相信我可以从那里继续。如果可能的话,最好对进行详细的说明。

WPF这份原稿.微/ mvvm导航

请阅读官方文档中有关导体和屏幕的内容。

作为一个简单的例子,您的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中的激活/停用

在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中,我使用了一个按钮来显示不同的视图,但你也可以使用菜单或类似的东西。