我有一个可观察的集合,我有一个collectionChanged事件。 我将其项目绑定到UI中的列表框。 当用户从列表框中删除UI中的某些项目时,CollectioChanged会被正确触发,但是,我需要知道已删除的项目的索引。 问题是我在更改后无法对集合进行indexOf,因为它不再具有已删除的项目..
我们可以访问从collectionschanged事件中从ObservableCollection中删除的索引列表吗?
答案 0 :(得分:7)
CollectionChanged
事件使用的事件会为您提供NotifyCollectionChangedEventArgs
。它有一个OldStartingIndex
属性,它会告诉你它被删除的索引。例如:
void Foo()
{
ObservableCollection<string> r = new ObservableCollection<string>();
r.CollectionChanged += r_CollectionChanged;
}
static void r_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
var itemRemovedAtIndex = e.OldStartingIndex;
}
假设我正在从不同索引的集合中删除MULTIPLE项目。因此,使用oldStartingIndex只会给我删除的第一个项目索引
该事件很可能会多次触发,每个项目一次。
答案 1 :(得分:2)
您似乎认为可以通过单个方法调用从ObservableCollection
中删除多个项目。这是不可能的。您必须调用Remove
,RemoveAt
或RemoveItem
,所有这些只会从集合中删除一个元素。这意味着每次从集合中删除项时,remove事件都将触发,OldStartingIndex
和OldItems
将包含对已删除的一个项的索引和单个元素数组的引用分别是一个项目。
您已经注意到,使用OldStartingIndex
无法在集合中进行查找,因为它已被删除。如果您需要访问原始引用的项目,可以使用OldItems
并获取第一个元素。
我没有使用ObservableCollection
,但我看到一次删除多个元素的唯一方法是拨打Clear
或ClearItems
。如果这些事件发生了变化,那么我会想象OldStartingIndex
将为0而OldItems
将包含对先前在集合中的所有元素的引用。
答案 2 :(得分:1)
是。 OldStartingIndex
中的NotifyCollectionChangedEventArgs
是删除该项目的索引。
答案 3 :(得分:1)
事件参数e
具有属性OldItems
和OldStartingIndex
。可能这有帮助吗?