ObservableCollection CollectionChanged事件

我有一个可观察的集合,我有一个collectionChanged事件。 我将其项绑定到UI中的列表框。 当用户从列表框中删除UI中的某些项目时,CollectioChanged会被正确触发,但是,我需要知道已删除的项目的索引。 问题是我在更改后无法对集合进行indexOf,因为它不再具有已删除的项目..

我们可以访问从collectionschanged事件中从ObservableCollection中删除的索引列表吗?

CollectionChanged事件使用一个事件,该事件为您提供NotifyCollectionChangedEventArgs 。 它有一个OldStartingIndex属性,它将告诉你它被删除的索引。 例如:

 void Foo() { ObservableCollection r = new ObservableCollection(); r.CollectionChanged += r_CollectionChanged; } static void r_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { var itemRemovedAtIndex = e.OldStartingIndex; } 

假设我正在从不同索引的集合中删除MULTIPLE项。所以使用oldStartingIndex只会给我第一个被删除的项索引

该事件很可能会多次触发,每个项目一次。

您似乎认为可以通过单个方法调用从ObservableCollection删除多个项目。 这是不可能的。 您必须调用RemoveRemoveAtRemoveItem并且所有这些仅从集合中删除单个元素。 这意味着每次从集合中删除项时,remove事件将触发, OldStartingIndexOldItems将包含对已删除的一个项的索引的引用以及该一个项的单个元素数组。

您已经注意到,您无法使用OldStartingIndex在集合中进行查找,因为它已被删除。 如果您需要访问原始引用的项目,可以使用OldItems并获取第一个元素。

我没有使用ObservableCollection但我看到一次删除多个元素的唯一方法是调用ClearClearItems 。 如果这些触发了更改的事件,那么我会想象OldStartingIndex将为0而OldItems将包含对先前在集合中的所有元素的引用。

是。 NotifyCollectionChangedEventArgs中的OldStartingIndex是从中删除项目的索引。

事件参数e具有属性OldItemsOldStartingIndex 。 可能这有帮助吗?