【发布时间】:2010-08-19 17:43:29
【问题描述】:
是否有使用 .NET 的 WeakEventManager 实现弱事件的示例?
我正在尝试按照文档中的“继承者说明”来实现它,但它含糊不清。例如,我无法弄清楚如何从自定义管理器中的静态 AddListener 函数调用 ProtectedAddListener。
【问题讨论】:
标签: .net weak-events weakeventmanager
是否有使用 .NET 的 WeakEventManager 实现弱事件的示例?
我正在尝试按照文档中的“继承者说明”来实现它,但它含糊不清。例如,我无法弄清楚如何从自定义管理器中的静态 AddListener 函数调用 ProtectedAddListener。
【问题讨论】:
标签: .net weak-events weakeventmanager
我按照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;
}
}
【讨论】:
((PropertyValue)source).Changed += DeliverEvent;
Sharp Observation 是一个开源项目,具有易于使用的实现。您可能想看看他们的代码或直接使用它。
MakeWeak() 方法返回一个调用相同的新委托 目标作为原始委托,但持有对 目标,以便代理不会使侦听器保持活动状态:
var handler= new PropertyChangingEventHandler(listener.HandleChange);
observable.PropertyChanging += handler.MakeWeak<PropertyChangingEventHandler>();
当前实现对委托有以下限制:
【讨论】: