2012-05-02 152 views
4

我有一个可观察的集合,我有一个collectionChanged事件连接上。 我有它的项目绑定到UI中的列表框。 当用户从列表框中删除用户界面中的一些项目时,CollectioChanged被正确触发,但是,我需要知道已删除项目的索引。 问题是我没有能力,因为它没有被删除的项目被更改后的集合上的indexOf ..ObservableCollection <T> CollectionChanged事件

我们可以访问从ObservableCollection从collectionchanged事件?

回答

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

假设我从收集不同indices..So使用oldStartingIndex只会给我辗转

本次活动的第一项指标中删除多个项目很可能会多次发射,每次发射一次。

+0

http://msdn.microsoft.com/en-us/library/system.collections.specialized.notifycollectionchangedeventargs.oldstartingindex.aspx – RobSiklos

+0

是的,但如果我有多个项目删除,然后呢? – user1202434

+1

我只有一个旧的起始索引...如果我从索引位置3,6或9中删除项目作为示例? – user1202434

1

是的。 中的OldStartingIndex是项目被删除的索引。

1

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

+0

是的,但如果我有多个项目删除,那么它不会。我需要知道所有被删除的指标。 – user1202434

+0

谢谢奥利弗......它确实有帮助。 – user1202434

+0

我在'ObservableCollection '中只看到'Remove(item)','RemoveAt(index)'和Clear()'的方法。您想如何一次移除非连续位置的物品?您可能必须逐个删除它们,并且将删除每个单个项目调用一次“CollectionChanged”事件。或者我错过了什么? –

2

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

您不能像使用OldStartingIndex那样在集合中进行查找,因为它已被删除。如果您需要访问原始引用的项目,则可以使用OldItems并采用第一个元素。

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

+0

是的......我是在错误的印象....谢谢 – user1202434

相关问题