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

MVVM-视图是否应影响主窗口视图模型?,mvvm,Mvvm,我希望这是一个关于MVVM的简单但做作的问题 我的主窗口有一个控件-ContentControl,它只显示两个视图中的一个。我希望能够通过一个按钮在两个视图之间切换。问题是,按钮将是每个视图上的控件。例如,View1有一个按钮,View2有一个按钮。UI上每个视图仅显示一个视图,单击按钮将显示另一个视图。但是,要使其工作,这意味着视图的ViewModel必须了解主窗口的ViewModel,才能更改视图。这似乎是错误的 问题可能是我的主窗口视图模型。其中一个项目是公共对象视图{get;set},这

我希望这是一个关于MVVM的简单但做作的问题

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

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


如果视图更新主窗口的ViewModel,是否会违反MVVM模式

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

这是MVVMLight工具包的Messenger的一个示例

这是Prism的EventAggregator在不同模型之间通信的一个示例

希望这有帮助

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


记住mvvm只是一种模式而不是一种宗教。。。只要使用那些能让你继续前进的东西,并且在你的后脑勺里有模式=)…

理想情况下,你的视图模型不应该对视图有任何引用。您所描述的似乎是一个视图模型,它正在执行另外两个视图模型

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

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


使用MVVM框架(例如)非常容易。您的主视图模型将是
导体
类型,然后您只需更改
活动项

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