C# CollectionChangedEventManager未转发自定义集合的事件

C# CollectionChangedEventManager未转发自定义集合的事件,c#,observablecollection,weak-events,C#,Observablecollection,Weak Events,我有一个定制的INotifyCollectionChanged类,它基本上只是围绕标准的observedcollection进行包装。无论何时添加/删除某些内容,都会按预期引发CollectionChanged事件。但是,当我尝试使用WeakEventListener来侦听此事件时,侦听器从未收到该事件。为什么会发生这种情况?我该如何解决 在下面的示例中,我希望抛出一个NotImplementedException,但是测试用例成功了(这清楚地表明事件确实引发了)。如果将集合更改为可观察集合而不

我有一个定制的
INotifyCollectionChanged
类,它基本上只是围绕标准的
observedcollection
进行包装。无论何时添加/删除某些内容,都会按预期引发
CollectionChanged
事件。但是,当我尝试使用
WeakEventListener
来侦听此事件时,侦听器从未收到该事件。为什么会发生这种情况?我该如何解决

在下面的示例中,我希望抛出一个
NotImplementedException
,但是测试用例成功了(这清楚地表明事件确实引发了)。如果将集合更改为
可观察集合
而不是
包装
,则会按预期引发异常

public class Test : IWeakEventListener
{
    private class Wrapper : INotifyCollectionChanged
    {
        private readonly ObservableCollection<string> _internal 
                                     = new ObservableCollection<string>();

        public void Add(string s)
        {
            _internal.Add(s);
        }

        public event NotifyCollectionChangedEventHandler CollectionChanged
        {
            add { _internal.CollectionChanged += value; }
            remove { _internal.CollectionChanged -= value; }
        }
    }

    public bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }

    [Test]
    public void CustomCollectionTest()
    {
        //change to new ObservableCollection<string>() and the exception gets thrown
        var collection = new Wrapper(); 
        var raised = false;
        collection.CollectionChanged += (o, e) => raised = true;
        CollectionChangedEventManager.AddListener(collection, this);
        collection.Add("foobar");
        Assert.True(raised);
    }
}
公共类测试:IWeakEventListener
{
私有类包装器:INotifyCollectionChanged
{
私有只读可观察收集\u内部
=新的ObservableCollection();
公共无效添加(字符串s)
{
_内部。添加(s);
}
公共事件NotifyCollectionChangedEventHandler CollectionChanged
{
添加{u internal.CollectionChanged+=value;}
删除{u internal.CollectionChanged-=value;}
}
}
public bool ReceiveWeakEvent(类型managerType、对象发送者、事件参数e)
{
抛出新的NotImplementedException();
}
[测试]
public void CustomCollectionTest()
{
//更改为new ObservableCollection()并引发异常
var collection=new Wrapper();
var=false;
collection.CollectionChanged+=(o,e)=>raised=true;
CollectionChangedEventManager.AddListener(集合,此);
收藏。添加(“foobar”);
Assert.True(提升);
}
}
可能相关,但仍未回答:

至于原因,问题与中的相同。本质上,向事件管理器注册的源必须与事件的发送者相同

作为此限制的解决方法,我只需确保
包装器
发送事件,而不是直接在包装的集合上使用事件

private class Wrapper : INotifyCollectionChanged
{
    private readonly ObservableCollection<string> _internal 
                                 = new ObservableCollection<string>();

    public Wrapper()
    {
        _internal.CollectionChanged += OnInternalChanged;
    }

    public void Add(string s)
    {
        _internal.Add(s);
    }

    private void OnInternalChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        var toRaise = CollectionChanged;
        if (toRaise != null)
            toRaise(this, e);
    }

    public event NotifyCollectionChangedEventHandler CollectionChanged;
}
私有类包装器:INotifyCollectionChanged
{
私有只读可观察收集\u内部
=新的ObservableCollection();
公共包装器()
{
_internal.CollectionChanged+=OnInternalChanged;
}
公共无效添加(字符串s)
{
_内部。添加(s);
}
InternalChanged上的私有void(对象发送方,NotifyCollectionChangedEventArgs e)
{
var toRaise=集合已更改;
if(toRaise!=null)
toRaise(本,e);
}
公共事件通知CollectionChangedEventHandler CollectionChanged;
}