【问题标题】:Generally raising PropertyChangeNotification change property in different class通常在不同的类中提高 PropertyChangeNotification 更改属性
【发布时间】:2013-08-31 02:41:21
【问题描述】:
我有两个班级:
- ViewModelA
- MainViewModel。
两者都实现INotifyPropertyChanged接口。
MainViewModel 拥有 ViewModelA 对象的可观察集合。我需要更改任何 ViewModelA 类中的某个属性“X”来触发 MainViewModel 中属性“Y”中的 PropertyChangeNotification。
问题 1:
实现这一点的常见做法是什么?
问题 2: 正在侦听 ObservableCollection 上的 CollectionChanged 并附加/删除事件处理程序(这将检查“X”属性是否已更改,如果是则触发“Y”属性更改通知)一个不好的做法?如果是,为什么?
【问题讨论】:
标签:
c#
mvvm
viewmodel
inotifypropertychanged
propertychanged
【解决方案1】:
我会在 ViewModelA 中实现自己的事件,并在 MainViewModel 中创建新的 ViewModelA 时订阅它。如果有事情发生,该事件将在 ViewModelA 中调用。
【解决方案2】:
只是为了澄清问题:您希望在子视图模型的属性(或者在您的特定情况下是子视图模型集合的元素)发生更改时回调到父视图模型。
在您的特定情况下,您希望使用主视图模型上的某些属性调用 INotifyPropertyChanged 事件来更新 UI。
本质上,您正在查看Observer Design Pattern 的一些派生,从而您以某种方式“侦听”子视图模型的更改并通知父级。这种模式的两种实现很容易供您使用:
-
事件:正如其他人已经在这个问题中回答的那样 - 您可以在子视图模型上创建一个事件,并直接从父视图订阅此事件。就个人而言,我尽量避免在我的视图模型上定义事件 - 对我来说,视图模型是视图的逻辑表示,在视图模型界面上设置公共事件似乎有悖常理。
事件聚合器: 使用Event Aggregator(例如 PRISM 提供的那个)允许您订阅从子视图模型触发的父视图模型上的消息.您不必在子视图模型上定义公共事件所付出的代价是依赖于IEventAggregator 的实现。我喜欢这种方法,因为它分离了父视图模型和子视图模型的关注点,以及它们之间的交互。一个警告是,事件聚合器的使用很容易被滥用,如果您不小心使用它,可能很难跟踪在您的应用程序中飞来飞去的所有消息。