我有一个可观察的集合,并且在其上连接了一个 collectionChanged 事件。我将其项目绑定到 UI 中的列表框。当用户从列表框中删除 UI 中的某些项目时,CollectioChanged 会正确触发,但是,我需要知道已删除项目的索引。问题是我无法在更改集合后对其进行 indexOf 操作,因为它不再具有已删除的项目..
我们可以从 collectionchanged 事件中访问从 ObservableCollection 中删除的索引列表吗?
该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;
}
假设我要从不同索引的集合中删除多个项目。所以使用 oldStartingIndex 只会给我第一个被删除的项目索引
该事件很可能会触发多次,每个项目一次。
是的。OldStartingIndex
inNotifyCollectionChangedEventArgs
是从中删除项目的索引。
event 参数e
具有属性OldItems
和OldStartingIndex
。这可能有帮助吗?
您似乎认为可以ObservableCollection
通过单个方法调用从一个中删除多个项目。这是不可能的。您必须调用Remove
、RemoveAt
或RemoveItem
所有这些仅从集合中删除单个元素。这意味着每次从集合中删除一项时,将触发 remove 事件,并且OldStartingIndex
和OldItems
将分别包含对已删除一项的索引和一项的单个元素数组的引用。
您无法使用OldStartingIndex
您所指出的在集合中进行查找,因为它已被删除。如果您需要访问最初引用的项目,您可以使用OldItems
并获取第一个元素。
我没有使用过ObservableCollection
,但我看到一次删除多个元素的唯一方法是调用Clear
or ClearItems
。如果这些触发了一个 changed 事件,那么我会想象这OldStartingIndex
将是 0 并且OldItems
将包含对以前在集合中的所有元素的引用。