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