检查对象是否附加了PropertyChanged事件

时间:2018-02-23 17:39:20

标签: c# wpf

当我的窗口加载时,我会填充一个ObservableCollection,并为每个项添加一个PropertyChanged事件。但是,可以将初始加载项添加到ObservableCollection之后。我希望能够监听ObservableCollection上的集合更改,检查是否添加了一个项目,然后在添加项目时附加一个事件监听器。

为此,我希望能够检查是否为每个单独的项定义了PropertyChanged属性,如果没有,则附加PropertyChanged事件。

这是我的代码:

items.CollectionChanged += (object sender, NotifyCollectionChangedEventArgs e) =>
{
    foreach (var item in items.Where(o => o.PropertyChanged == null)) //error here
    {
        item.PropertyChanged += Item_PropertyChanged;
    }
};

但是,我收到编译错误说:

  

事件'ModelBase.PropertyChanged'只能出现在+ =或 - =

的左侧

如何检查对象是否定义了PropertyChanged属性事件?

4 个答案:

答案 0 :(得分:3)

您可以迭代NotifyCollectionChangedEventArgs的argvOldItems属性。

使用NewItems,这适用于System.Collections.ObjectModel.ObservableCollection的所有值,e.Action除外。

NotifyCollectionChangedAction.Reset

答案 1 :(得分:2)

据推测,您试图多次避免订阅PropertyChanged事件。您可以使用NewItems的{​​{1}}属性执行此操作。

NotifyCollectionChangedEventArgs

您也可以使用if (e.NewItems != null && e.NewItems.Count != 0) { foreach (INotifyPropertyChanged item in e.NewItems) item.PropertyChanged += OnItemPropertyChanged; } 取消订阅。

OldItems

如果您的馆藏中还有未实施if (e.OldItems != null && e.OldItems.Count != 0) { foreach (INotifyPropertyChanged item in e.OldItems) item.PropertyChanged -= OnItemPropertyChanged; } 的商品,您可以将其与Jonathan Allen的答案结合使用,以过滤该列表。

答案 2 :(得分:1)

items.CollectionChanged += (object sender, NotifyCollectionChangedEventArgs e) =>
{
    foreach (var item in items.OfType<INotifyPropertyChanged>()) //filter the list
    {
        item.PropertyChanged += Item_PropertyChanged;
    }
};

答案 3 :(得分:0)

检查类是否实现了INotifyPropertyChanged接口。 在要实现PropertyChange方法的每个类中使用它。