3

我希望有一个关于 MVVM 的简单但人为的问题。

我的 MainWindow 有 1 个控件 - ContentControl 仅显示 2 个视图之一。我希望能够通过一个按钮在两个视图之间切换。问题是,按钮将是每个视图上的控件。EG View1 有一个按钮,View2 有一个按钮。UI 上只显示一个视图,单击按钮将显示另一个视图。但是,要使其工作,这意味着视图的 ViewModel 必须了解 MainWindow 的 ViewModel 才能更改视图。这似乎是错误的。

问题可能是我的 MainWindow ViewModel。其中一个项目是公共对象 View {get;set},这就是绑定到 MainWindows ContentControl 的内容。所以,这个属性需要从视图的视图模型中更新。

如果 View 更新 MainWindow 的 ViewModel 是否违反 MVVM 模式?

4

2 回答 2

3

我不确定我是否完全理解您的问题,但是在视图模型之间进行通信的一种很好的技术是通过 EventAggregator 或 Messenger 模式。这两个以松散耦合的方式实现 pub/sub。

这是 MVVMLight Toolkit 的 Messenger http://dotnet.dzone.com/articles/mvvm-light-whats-messenger的示例

这是 Prism 的 EventAggregator 的示例,用于在 viemodel 之间进行通信 http://rachel53461.wordpress.com/2011/06/05/communication-between-viewmodels-with-mvvm/

希望这可以帮助..

编辑:好的,我的回答仍然有效。如果您像上面提到的那样使用 pub/sub,您会告诉view1view2发送例如更改视图消息并定义目标(例如,目标可能是view2)。然后,您将订阅您MainViewModel的每条更改视图消息。当更改视图消息到达时。收到通知并执行事件,MainViewModel并且不一定要知道谁发送了消息。

请记住,mvvm 只是一种模式,而不是一种宗教......只需使用让你继续前进的东西,并在你的脑后留下模式 =)......

于 2013-02-19T11:20:27.857 回答
1

理想情况下,您的视图模型不应该对视图有任何引用。如果你在做 MVVM,那么你真的需要使用 MVVM 框架。您所描述的似乎是一个执行其他两个视图模型的视图模型。

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

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

使用诸如Caliburn.Micro之类的 MVVM 框架非常容易。您的主视图模型将是一种Conductor类型,然后您只需更改ActiveItem.

于 2013-02-19T11:36:17.877 回答