1

好的,所以我有一个附加属性(在静态类中声明),它将属性附加INotifyCollectionChanged到对象。

设置属性后,我想开始监视集合的更改,然后对集合附加到的对象执行一些操作。

第一次尝试:

private static void MyProperty_OnChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
{
    // We need both the dependency object, and the collection args to process the notification
    NotifyCollectionChangedEventHandler changedFunc = (sender, eventArgs) => MyProperty_OnCollectionChanged( d, sender, eventArgs );

    if( e.OldValue != null )
        e.OldValue.CollectionChanged -= changedFunc;   // Can you see the bug?
    if( e.NewValue != null )
        e.NewValue.CollectionChanged += changedFunc;

}

为了将集合附加到处理程序中的对象,我拉d入闭包。很容易,对吧?

好吧,我相信你可以在这里看到这个错误。当集合被删除或替换为新集合时,它无法取消注册事件处理程序,因为 changedFunc 是具有不同闭包的新处理程序。

那么,这样做的正确方法是什么?

4

2 回答 2

0

从您的代码中,尚不清楚此静态方法的位置。

有什么方法可以将事件处理程序存储为它所属类的成员变量?这将是一个可以根据需要添加和删除的单一引用。您当前正在每次 MyProperty_OnChanged 触发时构建一个新的事件处理程序。

或者,您是否可以更改您的集合以存储对事件处理程序的引用,以便您可以通过 e.OldValue.OldHandler (或类似的)访问它,以便您以后可以访问它?

于 2011-12-02T16:15:43.290 回答
0

我通过使用另一个附加属性来保存一个包含事件处理程序和引用的私有对象来解决这个问题d。实际上,我明确地创建了一个闭包类,并保留了对它的引用。

但这对我来说似乎是一种相当严厉的方法,我真的在寻找一个更优雅的解决方案。

于 2011-12-09T09:32:21.223 回答