Когда создается PropertyChangedEventManager и когда он прикрепляется? - PullRequest
8 голосов
/ 25 октября 2011

Короче говоря, очень длинная история ... Это большой проект WPF

У меня есть класс «Пациент», который реализует INotifyPropertyChanged. Когда я избавляюсь от этого класса, я проверяю, что PropertyChangedEventHandler равен нулю, и если нет, запускаю его для класса ListenerDetector, который регистрирует слушателей, чтобы мы могли отследить их и устранить утечки. У пациента есть некоторые свойства, которые связаны с элементами WPF, а также с другими объектами, которые используют PropertyChanged для отслеживания изменений.

После утилизации всего остального мой результат в журнале выглядит следующим образом:

Журнал: к пациенту по-прежнему подключены следующие слушатели: - System.ComponentModel.PropertyChangedEventManager

Вопрос: Когда создается PropertyChangedEventManager?

  • Когда создается пациент
  • Когда WPF связывается со свойством пациента
  • Какой-то другой момент.

Если для Patient.PropertyChangedEventHandler установлено значение null и, следовательно, оно отключено от PropertyChangedEventManager, есть ли способ восстановить диспетчер и снова прослушать Patient.PropertyChangedEventHandler? Пожалуйста, не спрашивайте, почему это произойдет, это точка напряжения здесь :-(

1 Ответ

7 голосов
/ 25 октября 2011

PropertyChangedEventManager создается WPF для поддержки привязки к любому классу, который реализует INotifyPropertyChanged.Он будет создан и использован, как только вы свяжетесь с любым классом, который реализует INotifyPropertyChanged.

При этом, это реализация шаблона WeakEventManager ,Пока он показывает подключенного слушателя, имейте в виду, что этот слушатель подключен с использованием Weak Event Pattern .Это исчезнет, ​​как только произойдет полная сборка мусора, так как он использует слабые ссылки для хранения подписки.Таким образом, эта конкретная подписка не должна быть причиной (долгосрочной) утечки памяти.

...