【发布时间】:2012-02-23 23:59:05
【问题描述】:
我正在尝试挂钩集合中INotifyPropertyChanged 对象的事件。
我见过的这个问题的每个答案都说要按如下方式处理:
void NotifyingItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if( e.NewItems != null )
{
foreach( INotifyPropertyChanged item in e.NewItems )
{
item.PropertyChanged += new PropertyChangedEventHandler(CollectionItemChanged);
}
}
if( e.OldItems != null )
{
foreach( ValidationMessageCollection item in e.OldItems )
{
item.PropertyChanged -= CollectionItemChanged;
}
}
}
我的问题是,每当开发人员在 NotifyingItems 集合上调用 Clear() 时,这都会完全失败。发生这种情况时,将使用 e.Action == Reset 调用此事件处理程序,并且 e.NewItems 和 e.OldItems 都等于 null(我希望后者包含所有项目)。
问题是这些项目不会消失,也不会被销毁,它们只是不再应该被当前班级监控 - 但因为我从来没有机会取消映射他们的 PropertyChangedEventHandler - 他们继续调用我的CollectionItemChanged 处理程序,即使它们已从我的 NotifyingItems 列表中清除。这种“完善”的模式应该如何处理这种情况?
【问题讨论】: