2011-10-25 12 views
7

Para hacer una historia muy corta ... Esto está en un gran proyecto de WPF¿Cuándo se crea PropertyChangedEventManager y cuándo se adjunta?

Tengo una clase "Paciente" que implementa INotifyPropertyChanged. Cuando dispongo de esta clase, compruebo que el PropertyChangedEventHandler es nulo y, si no, lo ejecuto en una clase ListenerDetector que registra a los oyentes para que podamos rastrearlos y limpiar las filtraciones. El paciente tiene algunas propiedades que están vinculadas a los elementos de WPF, así como a otros objetos; use su PropertyChanged para monitorear los cambios.

Después de deshacerse de todo lo demás, el resultado de mi registro es el siguiente:

Log: El paciente todavía tiene la siguiente oyente (s) adjunto: - System.ComponentModel.PropertyChangedEventManager

Pregunta: Cuando es el PropertyChangedEventManager creado?

  • Cuando se crea Paciente
  • Cuando WPF se une a la propiedad del Paciente
  • algún otro punto.

Si Patient.PropertyChangedEventHandler se establece en null y por lo tanto desconectados del PropertyChangedEventManager ¿hay alguna manera de recrear el gerente y tiene que escuchar la Patient.PropertyChangedEventHandler de nuevo? No pregunte por qué sucedió esto, ese es un punto de tensión aquí :-(

Respuesta

7

El PropertyChangedEventManager es creado por WPF para admitir el enlace a cualquier clase que implemente INotifyPropertyChanged. Se creará y se usará como pronto como se enlaza a cualquier clase que implementa INotifyPropertyChanged.

dicho esto, su una implementación del patrón de WeakEventManager. a pesar de que todavía está mostrando un oyente adjunta, se dan cuenta de que este oyente está unido mediante el Weak Event Pattern. esto irá tan pronto como se produce una recolección de basura completa, ya que está utilizando referencias débiles para mantener la suscripción. Por lo tanto, esta suscripción particular no debe ser la causa de una fuga de memoria (a largo plazo).