【问题标题】:WPF MVVM: How do ViewModels communicate with each other?WPF MVVM:ViewModels 如何相互通信?
【发布时间】:2011-06-21 00:48:56
【问题描述】:

我有一个视图,上面有 2 个子视图,每个视图都分配了一个 ViewModel:

ViewA - ViewModelA
{ 
   ViewB - ViewModelB
   ViewC - ViewModelC
}

ViewB 有一个文本框,ViewC 有一个组合框,我需要从 ViewModelA 访问这两个框。不是 GUI 控件本身,而是绑定值,即文本框的 .Text 和 ComboBox 的 .SelectedItem。目前我只是将 ViewModelB 和 ViewModelC 作为 ViewModelA 上的属性,但感觉不对。

在不破坏 MVVM 模式的情况下,视图模型相互通信的标准方式是什么?

【问题讨论】:

  • ViewModelB 有一个文本框,而 ViewModelC 有一个组合框...如果我从字面上理解,你已经打破了 MVVM 模式。 ViewModel 不引用 WPF 控件,它们公开绑定视图中控件的依赖属性的属性。 VM 可以为了绑定到它们的 View 的利益而公开属性,但它们应该不知道这些 View 的性质(或存在)。
  • 哎呀,我的意思是 ViewB 有一个文本框,而 ViewC 有一个组合框,我会修复它。

标签: wpf mvvm viewmodel


【解决方案1】:

断开连接的 ViewModel 相互通信的一种方法是使用发布/订阅机制,例如 PRISMs EventAggregator。但是,在父/子 ViewModel 关系中,我认为父级可以直接了解和控制子 ViewModel。

就个人而言,我不认为从其他 ViewModel 中组合 ViewModel 是一种不好的做法。我一直都这样做。 I generally favor composition over inheritance 在我的视图模型中。

【讨论】:

  • 在我的 ViewModel 中,我通常更喜欢组合而不是继承 - 它们是两种不同的东西,VM 可以同时使用两者。
  • @slugster - 是的,我两个都用。示例:我经常将很多基础架构问题放在基础 ViewModel 中(INotifyPropertyChanged 等...)。
  • @slug 我会说功能继承和信息组合。
【解决方案2】:

ViewModel 通常从模型中“继承”关系。在有意义的情况下添加关系并没有错。

ViewModel 拥有引用另一个 ViewModel 的属性是完全可以的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多