我有两个班级:
两者都实现INotifyPropertyChanged
接口。
MainViewModel包含一个可观察的ViewModelA对象集合。我需要在任何ViewModelA类中更改某个属性“X”,以在MainViewModel中的属性“Y”中触发PropertyChangeNotification。
问题1: 实现这个的常见做法是什么?
问题2:在ObservableCollection上侦听CollectionChanged并附加/删除事件处理程序(检查“X”属性是否已更改,如果是,则会触发“Y”属性更改通知)一个不好的做法?如果是,为什么?
答案 0 :(得分:0)
我会在ViewModelA中实现自己的事件,并在MainViewModel中创建新的ViewModelA时订阅它。该事件将在ViewModelA中调用,如果有些事情存在的话。
答案 1 :(得分:0)
只是为了澄清问题:当子视图模型的属性(或在您的特定情况下是子视图模型集合的元素)发生更改时,您希望回调到父视图模型。
在您的特定情况下,您希望使用主视图模型上的某个属性调用INotifyPropertyChanged事件来更新UI。
基本上,您正在查看Observer Design Pattern的一些推导,从而以某种方式“监听”子视图模型的更改并通知父级。您可以使用此模式的两种实现方式:
事件:正如其他人已在此问题中回答的那样 - 您可以在子视图模型上创建一个事件,并直接从父级订阅此事件。就个人而言,我不愿意在可能的情况下在我的视图模型上定义事件 - 对我来说,视图模型是视图的逻辑表示,并且在视图模型界面上有一个公共事件似乎与数字相反。
< / LI> 事件聚合器:使用Event Aggregator(例如PRISM提供的版本),您可以在父视图模型上订阅从子视图中触发的消息查看模型。您为不必在子视图模型上定义公共事件而支付的价格取决于IEventAggregator
的实现。我喜欢这种方法,因为它分离了父视图和子视图模型的关注点以及它们之间的交互。一句警告是,使用事件聚合器可能会被滥用,如果您不小心使用它,可能会很难跟踪应用程序中的所有消息。