MVVM - View 是否应该影响 MainWindow ViewModel?

标签 mvvm

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

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

问题可能是我的 MainWindow ViewModel。其中一个项目是公共(public)对象 View {get;set},它绑定(bind)到 MainWindows ContentControl。因此,需要从 View 的 View 模型更新此属性。

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

最佳答案

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

这是 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/

希望这对您有帮助..

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

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

关于MVVM - View 是否应该影响 MainWindow ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14956068/

相关文章:

wpf - 如何在我的 Prism 应用程序(如 MS Office)中执行多个 shell?

c# - 验证取消 UpdateSourceTrigger 时如何调用 CanExecute

wpf - 如何使用MVVM Light在wpf 4.0应用程序中实现有/无反馈对话框

c# - 将 itemsource 绑定(bind)到 View 模型中的多个集合

c# - 如何将两个不同的属性绑定(bind)到两个不同的数据上下文 WPF C#

c# - 更新目标触发器

xaml - Xamarin ICommand无法启动

wpf - 跨 ViewModel 共享状态/更改

.net - 绑定(bind)到所选项目

c# - WPF DataTemplate 显示 ToString