第一个 MVVM WPF 项目,所以我可能会问一个常见问题,但我找不到答案的搜索魔法。
我有许多视图,当在其中一个视图中调用某个命令时,我需要禁用其他一些视图。我在我的数据模型中放置了一个布尔标志,指示是否应该启用它们,并且其他视图可以通过它们的 ViewModel 绑定看到该更改。但是模型不是“INotifyPropertyChanged”,所以当我在数据模型中更改该标志时,什么都不会更新。那么实现这一点需要什么?
在 MVVM 中,一种解耦视图模型的方法是使用事件聚合器。当您执行命令时,它会引发一个事件。对此事件感兴趣的其他视图模型已设置订阅,并在事件触发时收到通知。
在名为“Event Aggregator Implementation Sample / Best Practices”的问题的答案中可以看到一个非常好的事件聚合器实现。
评论已经提出了一种可能的解决方案:INotifyPropertyChanged
在您的模型中实施。
但是,还有另一种解决方案可以让您保持模型更简单,降低架构层的耦合度。如果您的虚拟机相互依赖并将模型视为简单的数据桶,则可以通过自己的 INPC 实现通知它们,而不是依赖模型。换句话说,如果 VM A 需要知道模型 X 何时发生变化,它可以改为附加与 VM B 建立关系(包装模型 X),而不是直接依赖模型 X。
这正是您的 View-Model 的用途!虽然让你的模型实现 INPC 并没有错,但你当然不应该期望或依赖它。您的 View-Model 是 UI 无关模型和用户界面之间的桥梁。
解决您的问题的一种典型方法是创建 View-Model 类,这些类环绕您的模型类,这些类确实实现了 INPC。您直接绑定到 View-Models,允许值的更改通过 INPC 反映在 UI 中。