2011-12-02 18 views
1

好吧,所以我有一個附加屬性(在靜態類中聲明),它將INotifyCollectionChanged屬性附加到對象。取消訂閱存儲在附加屬性中的集合的CollectionChanged事件

設置屬性後,我想要開始監視集合中的更改,然後對集合附加的對象執行一些操作

第一次嘗試:

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到關閉。很簡單,對嗎?

嗯,我相信你可以在這裏看到bug。當集合被刪除或替換爲新集合時,它將無法取消註冊事件處理程序,因爲changedFunc是具有不同閉包的新處理程序。

那麼,正確的做法是什麼?

回答

0

我通過使用另一個附加屬性來解決這個問題,以保存包含事件處理程序的私人對象並參考d。實際上,我明確地創建了一個閉包類,並且保留了它的引用。

但是,這似乎是一個相當重的手段對我來說,我真的尋找一個更優雅的解決方案。

0

從您的代碼中,不清楚這種靜態方法的存在。

有什麼方法可以將事件處理程序存儲爲它所屬類的成員變量?這將是一個單獨的參考,可以根據需要添加和刪除。每當MyProperty_OnChanged觸發時,您當前正在構造一個新的事件處理程序。

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

+0

因爲它是一個附加屬性,所以沒有我可以將處理程序保存爲成員的類。 目前,我將_another_對象存儲在_another_附屬屬性中以解決此問題,但我正在尋找更乾淨的解決方案。 – Mark

+0

另外,它不是「我的」收藏。附加屬性應該與任何'INotifyCollectionChanged'實現對象一起工作。 – Mark