Хорошо, поэтому у меня есть прикрепленное свойство (объявленное в статическом классе), которое присоединяет свойство 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
в закрытие.Достаточно просто, верно?
Ну, я уверен, что вы можете увидеть ошибку здесь.Когда коллекция удаляется или заменяется новой коллекцией, она не может отменить регистрацию обработчика событий, потому что changeFunc - это новый обработчик с другим замыканием.
Итак, как правильно это сделать?