【问题标题】:Should I use weak event listeners while listening to DependencyProperty changes?我应该在监听 DependencyProperty 更改时使用弱事件监听器吗?
【发布时间】:2011-07-21 17:28:57
【问题描述】:

我在框架中寻找WeakEventManager 的实现,它侦听对DependencyProperties 的更改。我发现唯一的弱属性更改事件侦听器PropertyChangedEventManager 被设计用于实现 INotifyPropertyChanged 的​​类型,这让我有点困惑。

这是否意味着如果您监听 DependencyProperty 以进行更改

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

我不必担心通过事件注册保持活动状态的泄漏实例?

【问题讨论】:

    标签: .net wpf events weak-references weakeventmanager


    【解决方案1】:

    DependencyPropertyDescriptor 大量泄漏,因此我遇到了很多问题。除非您明确调用RemoveValueChanged,否则您的所有组件都将被植根。在内部,它维护HashTableEventHandler。它的作用如下:

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

    由于属性描述符被缓存,所有组件都将被植根。

    【讨论】:

    • 搞砸了。有更好的解决方案吗?
    • 一个简单的手动解决方案是在停止监听更改时显式调用RemoveValueChanged
    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多