我如何在视图模型之间切换视图
本文关键字:视图 之间 模型 | 更新日期: 2023-09-27 18:07:00
我的主窗口定义了应用程序的标记,对于这个特定的场景,假设我有一个2列的网格。
第一列显示导航链接,第二列显示不同的视图。
在主窗口xaml:
<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交换