是否有使用.NET WeakEventManager的弱事件的示例实现?
我正在尝试通过遵循文档中的“Notes to Inheritors”来实现它,但它很模糊。例如,我无法弄清楚如何从我的自定义管理器中的静态ProtectedAddListener
函数中调用AddListener
。
答案 0 :(得分:28)
我按照WeakEventManager文档的“Notes for Inheritors”部分中的指导原则自行计算出来。这是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;
}
}
答案 1 :(得分:6)
Sharp Observation是一个开源项目,具有易于使用的实现。您可能想要查看他们的代码或只是按原样使用它。
<强> Usage 强>
MakeWeak()方法返回一个调用它的新委托 目标作为原始委托,但持有弱的参考 目标,以便委托人不让监听器保持活着:
var handler= new PropertyChangingEventHandler(listener.HandleChange);
observable.PropertyChanging += handler.MakeWeak<PropertyChangingEventHandler>();
<强> Limitations 强>
当前实施对代表有以下限制: