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;
}