0

我有两节课:

  1. 视图模型A
  2. 主视图模型。

两者都实现INotifyPropertyChanged接口。

MainViewModel 拥有 ViewModelA 对象的可观察集合。我需要更改任何 ViewModelA 类中的某个属性“X”来触发 MainViewModel 中属性“Y”中的 PropertyChangeNotification。

问题 1: 实现这一点的常见做法是什么?

问题 2:在 ObservableCollection 上侦听 CollectionChanged 并附加/删除事件处理程序(这将检查“X”属性是否已更改,如果是则触发“Y”属性更改通知)是一种不好的做法?如果是,为什么?

4

2 回答 2

0

I would implement my own event in ViewModelA, and subscribe it when creating a new ViewModelA in MainViewModel. The event will be called in ViewModelA, if some thing habbend.

于 2013-08-28T06:40:38.440 回答
0

只是为了澄清问题:您希望在子视图模型的属性(或在您的特定情况下是子视图模型集合的元素)发生更改时回调到父视图模型。

在您的特定情况下,您希望使用主视图模型上的某些属性调用 INotifyPropertyChanged 事件来更新 UI。

本质上,您正在查看观察者设计模式的一些派生,通过这种方式,您以某种方式“监听”子视图模型的更改并通知父视图模型。此模式的两种实现很容易供您使用:

  1. 事件: 正如其他人已经在这个问题中回答的那样 - 您可以在子视图模型上创建一个事件,并直接从父视图订阅此事件。就我个人而言,我尽量避免在我的视图模型上定义事件——对我来说,视图模型是视图的逻辑表示,并且在视图模型界面上设置公共事件似乎违背了规律。

  2. 事件聚合器: 使用事件聚合器(例如 PRISM 提供的那个)允许您订阅从子视图模型触发的父视图模型上的消息。不必在子视图模型上定义公共事件所付出的代价是依赖于IEventAggregator. 我喜欢这种方法,因为它分离了父视图模型和子视图模型的关注点,以及它们之间的交互。一个警告是,事件聚合器的使用很容易被滥用,如果您不小心使用它,可能会难以跟踪在您的应用程序中飞来飞去的所有消息。

于 2013-08-28T10:31:54.707 回答