ObservableCollection<T> CollectionChanged event

本文关键字:CollectionChanged event gt ObservableCollection lt | 更新日期: 2023-09-27 18:32:52

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

我们是否可以访问从 ObservableCollection 中删除的索引列表?

ObservableCollection<T> CollectionChanged event

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 只会给我第一个被删除的项目索引

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

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

事件参数e具有属性 OldItemsOldStartingIndex 。也许这有帮助?

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

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

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

相关文章:
  • 没有找到相关文章