簡體   English   中英

取消訂閱存儲在附加屬性中的集合的CollectionChanged事件

[英]Un-subscribing from CollectionChanged event of a collection stored in an attached property

好的,因此我有一個附加屬性(在靜態類中聲明),該屬性將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是具有不同閉包的新處理程序。

那么,什么是正確的方法呢?

從您的代碼來看,尚不清楚此靜態方法在哪里。

有什么方法可以將事件處理程序存儲為它所屬類的成員變量? 那將是一個單數引用,可以根據需要添加和刪除。 當前,每次MyProperty_OnChanged觸發時,您都在構造一個新的事件處理程序。

或者,您可以更改集合以存儲對事件處理程序的引用,以便可以通過e.OldValue.OldHandler(或類似文件)訪問它,以便以后可以訪問它。

我使用另一個附加屬性來解決此問題,該屬性包含一個包含事件處理程序和對d引用的私有對象。 有效地,我正在顯式創建一個閉包類,並保留對其的引用。

但這對我來說似乎是一種繁重的做法,我確實在尋找一種更優雅的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM