25

是否有使用 .NET 的WeakEventManager实现弱事件的示例?

我正在尝试按照文档中的“继承者说明”来实现它,但它是模糊的。例如,我无法弄清楚如何ProtectedAddListener从自定义管理器中的静态AddListener函数调用。

4

2 回答 2

28

我按照WeakEventManager文档的“继承者说明”部分中的指南自行解决了这个问题。这是一个基本的实现WeakEventManager。产生事件的类被命名PropertyValue,事件被命名Changed

public class PropertyValueChangedEventManager : WeakEventManager
{
    public static PropertyValueChangedEventManager CurrentManager
    {
        get
        {
            var manager_type = typeof(PropertyValueChangedEventManager);
            var manager = WeakEventManager.GetCurrentManager(manager_type) as PropertyValueChangedEventManager;

            if (manager == null)
            {
                manager = new PropertyValueChangedEventManager();
                WeakEventManager.SetCurrentManager(manager_type, manager);
            }

            return manager;
        }
    }

    public static void AddListener(PropertyValue source, IWeakEventListener listener)
    {
        CurrentManager.ProtectedAddListener(source, listener);
    }

    public static void RemoveListener(PropertyValue source, IWeakEventListener listener)
    {
        CurrentManager.ProtectedRemoveListener(source, listener);
    }

    protected override void StartListening(object source)
    {
        ((PropertyValue)source).Changed += DeliverEvent;
    }

    protected override void StopListening(object source)
    {
        ((PropertyValue)source).Changed -= DeliverEvent;
    }
}
于 2010-08-19T20:06:14.907 回答
7

Sharp Observation是一个开源项目,具有易于使用的实现。您可能想看看他们的代码或按原样使用它。

用法

MakeWeak() 方法返回一个新委托,它调用与原始委托相同的目标,但持有对目标的弱引用,因此委托不会使侦听器保持活动状态:

var handler= new PropertyChangingEventHandler(listener.HandleChange);
observable.PropertyChanging += handler.MakeWeak<PropertyChangingEventHandler>();

限制

当前实现对委托有以下限制:

  • 不支持返回值。
  • 不支持 Out 和 Ref 的参数。
于 2011-11-03T10:41:37.690 回答