Должен ли я использовать слабых слушателей событий при прослушивании изменений DependencyProperty? - PullRequest
4 голосов
/ 21 июля 2011

Я искал в рамках реализации WeakEventManager , который прослушивает изменения в DependencyProperties.Меня немного смущает тот факт, что единственный слабый слушатель события изменения свойства, который я нахожу, PropertyChangedEventManager , предназначен для использования с типами, которые реализуют INotifyPropertyChanged.

Означает ли это, что если вы слушаете DependencyProperty для изменений

DependencyPropertyDescriptor
    .FromProperty(target, target.OwnerType)
    .AddValueChanged(component, handler)

, мне не нужно беспокоиться о протекающих экземплярах, которые сохраняются при регистрации события?

1 Ответ

6 голосов
/ 21 июля 2011

DependencyPropertyDescriptor большая утечка, у меня было много проблем из-за этого.Если вы явно не вызовете RemoveValueChanged, все ваши компоненты будут укоренены.Внутренне он поддерживает HashTable из EventHandler.Вот что он делает:

if (this.valueChangedHandlers == null)
  this.valueChangedHandlers = new Hashtable();
EventHandler eventHandler = (EventHandler) this.valueChangedHandlers[component];
this.valueChangedHandlers[component] = (object) Delegate.Combine((Delegate) eventHandler, (Delegate) handler);

Поскольку дескрипторы свойств кэшируются, все ваши компоненты будут укоренены.

...