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

时间:2011-08-27 07:30:54

标签: c# wpf mvvm

我的主窗口定义了应用程序的标记,对于这个特定的场景,我想说我有一个有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将切换到所需的视图?

2 个答案:

答案 0 :(得分:0)

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

如果您的MainWindowViewModel创建了所有其他人,我会坚持使用界面解决方案。例如,您可以让MainWindowVM实现这样的接口,并在创建时将其注入所有child-vm。这与你的事件方法大致相同,但不是提供孩子,主要是必须订阅你有主要的东西...恕我直言更好的方法。

答案 1 :(得分:0)

好的,我可能理解你的观点。您希望该控制器实际上是modelview,它通知mainmodelview它必须与其他人交换的事实。

考虑到我们正在讨论WPF,请在mainmodelview上创建DependecyProperty,并从childview设置它,后面的代码将触发模型视图交换。