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を使用すると、削除された最初のアイテムインデックスが得られます。

イベントは、ほとんどの場合、アイテムごとに1回ずつ、複数回発生します。

于 2012-05-02T18:20:45.430 に答える
1

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

于 2012-05-02T18:21:35.300 に答える
1

event 引数eには、 プロパティOldItemsとがありOldStartingIndexます。これは役に立ちますか?

于 2012-05-02T18:25:15.417 に答える
1

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

OldStartingIndex削除されているため、指摘したようにを使用してコレクション内を検索することはできません。そこで参照されていた元のアイテムにアクセスする必要がある場合はOldItems、最初の要素を使用して取得できます。

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

于 2012-05-02T18:37:03.393 に答える