MVVM - 视图是否应影响主窗口视图模型?

3
我希望可以针对MVVM模式提出一个简单而刻意的问题。
我的MainWindow中只有一个ContentControl控件,用来展示其中的两个视图之一。我想通过按钮在这两个视图之间进行切换。但问题是,这些按钮需要分别放置在每个视图上。例如,View1有一个按钮,View2也有一个按钮。在UI上仅会显示其中一个视图,并通过点击按钮显示另一个视图。然而,为了实现这一点,视图的ViewModel必须知道MainWindow的ViewModel以便更改视图。这似乎是不正确的。
问题可能出在我的MainWindow ViewModel上。其中一个项目是public object View {get;set},这是与MainWindows ContentControl绑定的属性。因此,需要从View的ViewModel中更新此属性。
如果视图更新了MainWindow的ViewModel,是否违反了MVVM模式?
2个回答

3
我不确定我是否完全理解了您的问题,但是在视图模型之间进行通信的一种好方法是通过EventAggregator或Messenger Pattern。这两种方式以松散耦合的方式实现了发布/订阅。
以下是MVVMLight工具包Messenger的示例:http://dotnet.dzone.com/articles/mvvm-light-whats-messenger 以下是Prism的EventAggregator示例,用于在视图模型之间进行通信:http://rachel53461.wordpress.com/2011/06/05/communication-between-viewmodels-with-mvvm/ 希望这可以帮助您...
编辑:好的,我的答案仍然有效。如果您像上面提到的那样使用发布/订阅,您将要求view1和view2发送更改视图消息,然后定义一个目标(例如target可以是view2)。然后,在主视图模型中订阅每个更改视图消息。当更改视图消息到达时,主视图模型会收到通知并执行事件,不必知道谁发送了该消息。
请记住,MVVM只是一种模式,而不是一种信仰...只需使用使您保持前进的东西,并将模式放在您的脑海中=)。

我更新了我的问题,这可能会使它更清晰。谢谢你提供的链接。 - Dave

1

理想情况下,您的视图模型不应该有任何与视图相关的引用。如果您正在使用MVVM,则确实需要使用MVVM框架。您所描述的似乎是一个管理两个其他视图模型的视图模型。

个人而言,如果只有一个订阅者对消息感兴趣(在这种情况下是父级主视图模型),我不会使用事件聚合器。您可以使用普通的.NET事件并应用标准事件模式,如果您想要松耦合。

您的主视图模型将持有对两个子视图模型的引用,并订阅它们的事件来启动切换。当单击子1上的按钮时,它会调用其事件,然后主视图模型在其事件处理程序中将当前视图切换为子2。

使用MVVM框架(例如Caliburn.Micro)非常容易。您的主视图模型将是Conductor类型,然后您只需更改ActiveItem即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接