我如何在视图模型之间切换视图

本文关键字:视图 之间 模型 | 更新日期: 2023-09-27 18:07:00

我的主窗口定义了应用程序的标记,对于这个特定的场景,假设我有一个2列的网格。
第一列显示导航链接,第二列显示不同的视图。
在主窗口xaml:

中定义了2个视图(和2个视图模型)
<Window.Resources>       
   <DataTemplate DataType="{x:Type vm:Window1ViewModel}">
       <vw:Window1View/>
   </DataTemplate>
   <DataTemplate DataType="{x:Type vm:Window2ViewModel}">
       <vw:Window2View/>
   </DataTemplate>      
</Window.Resources>

在第二个网格列中显示我得到的视图:

<ContentControl  Content="{Binding Path=ViewModel}" HorizontalAlignment="Left">                    
</ContentControl>

其中ViewModel是我根据我想要显示的视图(ViewModel)设置的属性。

:

ViewModel = new Window1ViewModel();
(mainwindowview的datacontext被设置为MainWindowViewModel)

所以从MainWindowViewModel切换视图是没有问题的。

我的问题是如何在Window1ViewModel切换到Window1ViewMode2?

不同的viewmodel并不"知道"其他的viewmodel。
只有MainWindowViewModel知道其他的…

我该如何解决这个问题?也许我应该定义一个自定义事件(带参数),MainWindowViewModel将订阅和其他视图模型将触发它,然后MainWindowViewModel将切换到所需的视图?

我如何在视图模型之间切换视图

您描述的解决方案是一种可能性。我能想到的另一个方法是使用某种导航服务(传递给所有-视图模型的静态类或接口)来完成这种工作。

如果你的MainWindowViewModel创建了所有其他的,我会坚持接口解决方案。例如,您可以让MainWindowVM实现这样的接口,并在创建时将其注入所有子虚拟机。这与您的事件方法非常相似,但不是由子节点提供和主节点订阅,而是由主节点提供一些东西……我认为这是更好的方法。

好吧,也许我明白你的意思了。你希望那个控制器实际上是modelview,它通知mainmodelview它必须与其他控制器交换的事实。

考虑到我们正在谈论WPF,在mainmodelview上创建dependdecyproperty,并从childview中设置它,这将在后面的代码中触发modelview交换