我有一个奇怪的问题设置和删除事件。不幸的是,我的问题非常复杂,用一个简单的例子来演示它是不可能的。 因此,我将示意地绘制我的问题,希望有人会有一个想法。
我有一个包含对象MyObject
的集合的类public class MyCollection : ObservableCollection<MyObject>
{
}
另外,我有一个MyObjectView类来查看网格中的每个MyObject。 我附加到MyCollection的CollectionChanged并为每个MyObject创建一个MyObjectView并将MyObjectView添加到网格中。 MyObjectView还从MyCollection注册CollectionChanged。
每次MyCollection更改时,所有MyObjectView都会从CollectionChanged中删除和取消注册。
所以这是一个例子: 1.我添加一个新的MyObject,然后创建一个新的MyObjectView 1并添加到网格中。 2.我添加了一个新的MyObject,然后旧的MyObjectView 1被销毁,取消注册并从网格中删除。 3.现在创建了两个新的MyObjectViews 2 + 3,从MyCollection注册到CollectionChanged并添加到网格中。
从CollectionChanged事件取消注册工作正常,我只能看到它 MyObjectView 2 + 3位于InvocationList中。 MyObjectView 1不在列表中。
如果现在引发了CollectionChanged事件,MyObjectView 1突然也会获得该事件。我试图检查发生了什么,因为我创建了自己的添加/删除处理程序到事件中的列表。该列表看起来也不错。它包含我假设的内容。但是当我调用ToArray()或CopyTo并获得完全不同的内容时。我得到的是第一个内容,而不是当前的内容。
因此,当查看列表时,事件包含MyObjectView 2 + 3。查看ToArray()返回的数组时,我得到MyObjectView 1。
List<NotifyCollectionChangedEventHandler> aHandlers = new List<NotifyCollectionChangedEventHandler>();
public event NotifyCollectionChangedEventHandler CollectionChanged
{
add {aHandlers.Add(value);}
remove {aHandlers.Remove(value);}
}
public void RaiseChangedEvent()
{
// here's the problem aHandlers has 2 items, where handlers only has 1
NotifyCollectionChangedEventHandler[] handlers = aHandlers.ToArray();
foreach (NotifyCollectionChangedEventHandler aHandler in handlers )
{
aHandler(this, new NotifyCollectionChangedEventArgs(NotifyCollectionAction.Reset));
}
}
没有线程,一切都发生在同一个线程中。我真的不知道问题是什么。