【问题标题】:Generally raising PropertyChangeNotification change property in different class通常在不同的类中提高 PropertyChangeNotification 更改属性
【发布时间】:2013-08-31 02:41:21
【问题描述】:

我有两个班级:

  1. ViewModelA
  2. 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 的一些派生,从而您以某种方式“侦听”子视图模型的更改并通知父级。这种模式的两种实现很容易供您使用:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        • 2017-09-25
        • 2013-12-10
        • 2014-03-26
        • 1970-01-01
        相关资源
        最近更新 更多