我的主窗口定义了应用程序的标记,对于这个特定的场景,我想说我有一个有2列的网格 第一列将具有导航链接,第二列将显示不同的视图 在mainwindow 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将切换到所需的视图?
答案 0 :(得分:0)
您描述的解决方案是一种可能性。另一个我能想到的是使用某种导航服务(传递给所有孩子 -Viewmodels的静态类或接口)来做这种工作。
如果您的MainWindowViewModel创建了所有其他人,我会坚持使用界面解决方案。例如,您可以让MainWindowVM实现这样的接口,并在创建时将其注入所有child-vm。这与你的事件方法大致相同,但不是提供孩子,主要是必须订阅你有主要的东西...恕我直言更好的方法。
答案 1 :(得分:0)
好的,我可能理解你的观点。您希望该控制器实际上是modelview,它通知mainmodelview它必须与其他人交换的事实。
考虑到我们正在讨论WPF,请在mainmodelview上创建DependecyProperty,并从childview设置它,后面的代码将触发模型视图交换。