当我的窗口加载时,我会填充一个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属性事件?
答案 0 :(得分:3)
您可以迭代NotifyCollectionChangedEventArgs的argv
和OldItems
属性。
使用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方法的每个类中使用它。