使用.NET的WeakEventManager实现弱事件的示例实现

25

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

我正试图通过遵循文档中的“继承者注意事项”来实现它,但是它非常模糊。例如,我无法弄清如何从我的自定义管理器中的静态AddListener函数调用ProtectedAddListener

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;
    }
}

11
微软提供了.NET内置的PropertyChangedEventManager(http://msdn.microsoft.com/en-us/library/system.componentmodel.propertychangedeventmanager.aspx)和CollectionChangedEventManager(http://msdn.microsoft.com/en-us/library/system.collections.specialized.collectionchangedeventmanager.aspx)。 - sourcenouveau
4
谢谢您的示例。尽管更短的实现方式是 ((PropertyValue)source).Changed += DeliverEvent; - alpha-mouse
1
@alpha-mouse:你的“短实现”中到底哪里“弱”了?我找不到。 - Paul Groke
@Paul Groke:我的评论是针对此回答之前未编辑的版本。现在我完全没有任何异议。 - alpha-mouse

7

Sharp Observation是一个开源项目,其实现易于使用。您可以查看他们的代码或直接使用。

用法

MakeWeak()方法返回一个新的委托,该委托调用与原始委托相同的目标,但保留对目标的弱引用,以便监听器不会因委托而保持活动状态:

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

限制

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

  • 不支持返回值。
  • 不支持 Out 和 Ref 参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接