【问题标题】:MVVM - Should a View affect the MainWindow ViewModel?MVVM - 视图是否应该影响 MainWindow ViewModel?
【发布时间】:2013-02-19 11:14:50
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: mvvm


    【解决方案1】:

    我不确定我是否完全理解您的问题,但在视图模型之间进行通信的一种好技术是通过 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 只是一种模式,而不是一种宗教......只需使用让你前进的东西,并在你的脑后留下模式 =)......

    【讨论】:

    • 我更新了我的问题,这可能会更清楚。谢谢你的链接。
    【解决方案2】:

    理想情况下,您的视图模型不应该对视图有任何引用。 If you're doing MVVM then you really need to use an MVVM framework。您所描述的似乎是一个执行其他两个视图模型的视图模型。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-09
      • 2010-10-20
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多