Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用.NET';温特经理_.net_Weak Events_Weakeventmanager - Fatal编程技术网

使用.NET';温特经理

使用.NET';温特经理,.net,weak-events,weakeventmanager,.net,Weak Events,Weakeventmanager,是否有使用.NET实现弱事件的示例 我试图通过遵循文档中的“继承人须知”来实现它,但它是模糊的。例如,我不知道如何从自定义管理器中的staticAddListener函数调用ProtectedAddListener。我按照文档“继承者注释”部分中的指导原则自己解决了这个问题。下面是WeakEventManager的基本实现。源于事件的类名为PropertyValue,事件名为Changed public class PropertyValueChangedEventManager : WeakE

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


我试图通过遵循文档中的“继承人须知”来实现它,但它是模糊的。例如,我不知道如何从自定义管理器中的static
AddListener
函数调用
ProtectedAddListener

我按照文档“继承者注释”部分中的指导原则自己解决了这个问题。下面是
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;
    }
}
是一个开源项目,具有易于使用的实现。你可能想看看他们的代码,或者只是照原样使用

方法返回一个新委托,该委托调用相同的 目标作为原始委托,但对 使侦听器不被委托保持活动状态:

var handler=newpropertychangingeventhandler(listener.HandleChange);
observable.PropertyChanging+=handler.MakeWeak();

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

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

Microsoft提供了.NET内置的PropertyChangedEventManager()和CollectionChangedEventManager()。感谢您的示例。a尽管较短的实现将是
((PropertyValue)source)@alpha-mouse:您的“较短的实现”中的“弱点”到底在哪里?保罗·格罗克:我的评论与之前未经编辑的答案有关。现在我一点也不反对。
var handler= new PropertyChangingEventHandler(listener.HandleChange);
observable.PropertyChanging += handler.MakeWeak<PropertyChangingEventHandler>();