2012-05-02 117 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

相關問題