INotifyCollectionChanged
基本的に標準をラップするだけのカスタムクラスがありますObservableCollection
。何かが追加/削除されるたびに、CollectionChanged
期待どおりにイベントが発生します。ただし、を使用してこのイベントをリッスンしようとするWeakEventListener
と、リスナーはイベントを受け取りません。なぜこれが起こっているのですか?どうすれば修正できますか?
以下のサンプルでは、 aNotImplementedException
がスローされることを期待しますが、テスト ケースは成功します (これは、イベントが実際に発生したことを明確に示しています)。コレクションをObservableCollection
ではなく に変更するとWrapper
、期待どおりに例外がスローされます。
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);
}
}
関連している可能性がありますが、まだ回答がありません:
送信者が公称ではない場合、WeakEventManager がイベントを発生させないのはなぜですか?