【问题标题】:Handling dependency in MVVM architecture处理 MVVM 架构中的依赖关系
【发布时间】:2013-05-30 11:25:10
【问题描述】:

第一个 MVVM WPF 项目,所以我可能会问一个常见问题,但我找不到答案的搜索魔法。

我有许多视图,当在其中一个中调用某个命令时,我需要禁用其他一些视图。我在我的数据模型中放置了一个布尔标志,指示是否应该启用它们,并且其他视图可以通过它们的 ViewModel 绑定看到该更改。但是模型不是“INotifyPropertyChanged”,所以当我在数据模型中更改该标志时,什么都不会更新。那么要做到这一点需要什么?

【问题讨论】:

  • 让您的模型实现 INPC?让你的模型实现 INPC 并不是一件坏事。如果您使用 MVVM Light,请从 ObservableObject 继承模型,而不是从 VM 继承的 ViewModelBase
  • 那是合乎逻辑的,Viv! (只是不知道这是否已经完成)。
  • 或者您可以在模型中更新数据后简单地引发一些事件......您的其他视图将被订阅,因此当您引发该事件时,您的视图会从模型中读取数据并相应地更新。跨度>

标签: wpf mvvm


【解决方案1】:

在 MVVM 中,一种解耦视图模型的方法是使用 event aggregator。当您执行命令时,它会引发一个事件。对此事件感兴趣的其他视图模型已设置订阅,并会在事件触发时收到通知。

an answer to the question named "Event Aggregator Implementation Sample / Best Practices" 中可以看到一个非常好的事件聚合器实现。

【讨论】:

    【解决方案2】:

    cmets 已经提出了一种可能的解决方案:在您的模型中实现 INotifyPropertyChanged

    但是,还有另一种解决方案可以让您保持模型更简单并减少架构层的耦合。如果您的虚拟机相互依赖并将模型视为简单的数据桶,则可以通过自己的 INPC 实现通知它们,而不是依赖模型。换句话说,如果 VM A 需要知道模型 X 何时发生变化,它可以改为附加与 VM B 建立关系(包装模型 X),而不是直接依赖模型 X。

    【讨论】:

      【解决方案3】:

      这正是您的 View-Model 的用途!虽然让你的模型实现 INPC 并没有错,但你当然不应该期望或依赖它。您的 View-Model 是 UI 无关模型和用户界面之间的桥梁。

      解决您的问题的典型方法是创建 View-Model 类,这些类环绕您的模型类,这些类确实实现了 INPC。您直接绑定到 View-Models,允许值的更改通过 INPC 反映在 UI 中。

      【讨论】:

        猜你喜欢
        • 2015-05-11
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 2021-10-24
        • 2016-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多