好吧,所以我有一個附加屬性(在靜態類中聲明),它將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是具有不同閉包的新處理程序。
那麼,正確的做法是什麼?
因爲它是一個附加屬性,所以沒有我可以將處理程序保存爲成員的類。 目前,我將_another_對象存儲在_another_附屬屬性中以解決此問題,但我正在尋找更乾淨的解決方案。 – Mark
另外,它不是「我的」收藏。附加屬性應該與任何'INotifyCollectionChanged'實現對象一起工作。 – Mark