是否有使用.NET的WeakEventManager的弱事件实现示例?
我正试图通过遵循文档中的“继承者注意事项”来实现它,但是它非常模糊。例如,我无法弄清如何从我的自定义管理器中的静态AddListener
函数调用ProtectedAddListener
。
是否有使用.NET的WeakEventManager的弱事件实现示例?
我正试图通过遵循文档中的“继承者注意事项”来实现它,但是它非常模糊。例如,我无法弄清如何从我的自定义管理器中的静态AddListener
函数调用ProtectedAddListener
。
我按照“继承者指南”部分的指南自己解决了问题,这些指南可以在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;
}
}
Sharp Observation是一个开源项目,其实现易于使用。您可以查看他们的代码或直接使用。
MakeWeak()方法返回一个新的委托,该委托调用与原始委托相同的目标,但保留对目标的弱引用,以便监听器不会因委托而保持活动状态:
var handler= new PropertyChangingEventHandler(listener.HandleChange);
observable.PropertyChanging += handler.MakeWeak<PropertyChangingEventHandler>();
当前实现对委托有以下限制:
((PropertyValue)source).Changed += DeliverEvent;
。 - alpha-mouse