2012-05-02 13 views
4

私は観測可能なコレクションを持っており、そのコレクションにcollectionChangedイベントがあります。 私はその項目をUIのリストボックスにバインドしています。 ユーザーがUIの一部の項目をリストボックスから削除すると、CollectioChangedが正しく起動されますが、削除された項目のインデックスを知る必要があります。 問題は、削除されたアイテムがなくなってコレクションのindexOfを変更できなくなったことです。ObservableCollection <T> CollectionChangedイベント

ObservableCollectionから削除されたインデックスのリストに、コレクションチェンジイベント?

答えて

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を使用して、異なるindices..Soでコレクションから複数の項目を削除していますと仮定します各アイテムごとに1回、複数回発射されます。

+0

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

+0

はい、複数のアイテムが削除されていますか? – user1202434

+1

私は古い開始インデックスを1つだけ持っています...例としてインデックス位置3,6、または9からアイテムを削除した場合はどうなりますか? – user1202434

1

はい。 NotifyCollectionChangedEventArgsOldStartingIndexは、アイテムが削除されたインデックスです。

1

イベント引数eのプロパティは、OldItemsOldStartingIndexです。これは役立つかもしれませんか?

+0

はい、しかし、私は複数のアイテムを削除している場合は、それは失われます。私は削除されたすべての指標を知る必要があります。 – user1202434

+0

おかげでオリバー...助けてくれる。 – user1202434

+0

ObservableCollection で 'Remove(item)'、 'RemoveAt(index)'、 'Clear()'メソッドしか見ることができません。一度に非連続位置でアイテムをどのように削除したいのですか?おそらくそれらを1つずつ削除する必要があり、 'CollectionChanged'イベントは削除された単一のアイテムごとに1回呼び出されます。または私は何かを逃していますか? –

2

ObservableCollectionから複数のアイテムを1回のメソッド呼び出しで削除することができます。これは不可能です。 RemoveRemoveAt、またはRemoveItemのいずれかを呼び出す必要があり、これらのすべてがコレクションから1つの要素を削除するだけです。つまり、アイテムがコレクションから削除されるたびに、removeイベントが発生し、OldStartingIndexOldItemsには、削除されたアイテムのインデックスへの参照とそのアイテムの単一要素配列がそれぞれ含まれます。

削除されているため、前述のようにOldStartingIndexを使用してコレクション内でルックアップを実行することはできません。元々参照されていたアイテムにアクセスする必要がある場合は、OldItemsを使用して最初の要素を取ります。

私はObservableCollectionを使用していませんが、複数の要素を一度に削除する唯一の方法は、ClearまたはClearItemsです。これらが変更されたイベントを発生させた場合、OldStartingIndexは0で、OldItemsはコレクション内の以前のすべての要素への参照を含んでいると思います。

+0

うん...私は間違った印象の下にいた....ありがとう – user1202434

関連する問題