【问题标题】:When is PropertyChangedEventManager created and when is it attached?PropertyChangedEventManager 何时创建以及何时附加?
【发布时间】:2011-12-15 05:01:47
【问题描述】:

长话短说……这是在一个大型 WPF 项目中

我有一个实现INotifyPropertyChanged 的“Patient”类。当我处理这个类时,我正在检查PropertyChangedEventHandler 是否为空,如果没有,则将其运行到记录侦听器的ListenerDetector 类,以便我们可以跟踪它们并清除泄漏。 Patient 确实有一些属性绑定到 WPF 元素以及使用其PropertyChanged 来监视更改的其他对象。

在处理完其他所有内容后,我的日志结果如下:

日志:患者仍附加以下侦听器: - System.ComponentModel.PropertyChangedEventManager

问题: PropertyChangedEventManager 是什么时候创建的?

  • 创建患者时
  • 当 WPF 绑定到 Patient 属性时
  • 其他一点。

如果Patient.PropertyChangedEventHandler 设置为null 并因此与PropertyChangedEventManager 断开连接,有没有办法重新创建管理器并让它再次收听Patient.PropertyChangedEventHandler?请不要问为什么会发生这种情况,这是一个紧张的地方:-(

【问题讨论】:

    标签: .net wpf memory-leaks inotifypropertychanged


    【解决方案1】:

    PropertyChangedEventManager 由 WPF 创建,以支持绑定到任何实现 INotifyPropertyChanged 的类。只要您绑定到实现INotifyPropertyChanged 的任何类,它就会被创建和使用。

    话虽如此,它是WeakEventManager 模式的实现。虽然它仍然显示附加的侦听器,但请注意该侦听器是使用Weak Event Pattern 附加的。一旦发生完整的垃圾回收,这将消失,因为它使用弱引用来保存订阅。因此,此特定订阅不应成为(长期)内存泄漏的原因。

    【讨论】:

      猜你喜欢
      • 2014-07-12
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      相关资源
      最近更新 更多