处理ObservableCollection CollectionChanged事件

时间:2009-12-10 18:29:18

标签: wpf silverlight observablecollection inotifycollectionchanged

我在Silverlight工具包中看到过如下代码,无法理解它的安全性:

private void ItemsSourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    // Update the cache
    if (e.Action == NotifyCollectionChangedAction.Remove && e.OldItems != null)
    {
        for (int index = 0; index < e.OldItems.Count; index++)
        {
            _items.RemoveAt(e.OldStartingIndex);
        }
    }
}

如果你从索引5中删除一个项目,那么是否会将索引5之后_items集合中每个项目的当前索引更改为比以前少一个?那么如何使用像这段代码那样的“旧”索引来连续删除项目是否安全?

我真的很想知道为什么会这样。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

此代码看起来正在从特定的起始索引中删除一组连续的项目。如果您仔细阅读删除电话:

_items.RemoveAt( e.OldStartingIndex );  

您会注意到它正在迭代地从常量索引中删除项目。这意味着它通过删除连续范围中的项目来折叠列表。这可能是正确的 - 假设这是代码的意图。

循环执行的次数与e.OldItems.Count指示的次数相同。所以(大概)它会告诉从给定索引开始删除多少项。

作为一般做法,您必须小心如何从集合中删除项目,原因如下:

  1. 项目索引确实会在您删除项目时发生变化。因此,必须注意避免因项目索引位置变化而导致的错误。
  2. 在迭代列表时进行变换(如在foreach循环中或使用显式IEnumerator)会导致异常。迭代时不能改变列表(添加或删除) - 它使迭代器无效。