4

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

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

4

4 回答 4

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;
}

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

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

于 2012-05-02T18:20:45.430 回答
1

是的。OldStartingIndexinNotifyCollectionChangedEventArgs是从中删除项目的索引。

于 2012-05-02T18:21:35.300 回答
1

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

于 2012-05-02T18:25:15.417 回答
1

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

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

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

于 2012-05-02T18:37:03.393 回答