ObservableCollection ‹T› Событие CollectionChanged

У меня есть наблюдаемая коллекция, и у меня есть событие collectionChanged, связанное с ней. У меня есть его элементы, привязанные к списку в пользовательском интерфейсе. Когда пользователь удаляет некоторые элементы пользовательского интерфейса из списка, CollectioChanged запускается правильно, однако мне нужно знать индексы элементов, которые были удалены. Проблема в том, что я не могу использовать indexOf для коллекции после ее изменения, потому что в ней больше нет удаленного элемента.

Можем ли мы получить доступ к списку индексов, которые были удалены из ObservableCollection из события collectionchanged?


person user1202434    schedule 02.05.2012    source источник


Ответы (4)


Событие CollectionChanged использует событие, которое дает вам _ 2_. У него есть свойство 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 просто даст мне индекс первого элемента, который был удален.

Событие, скорее всего, сработает несколько раз, по одному для каждого элемента.

person vcsjones    schedule 02.05.2012
comment
msdn.microsoft.com/en-us/ библиотека / - person RobSiklos; 02.05.2012
comment
Да, но если я удалю несколько элементов, тогда? - person user1202434; 02.05.2012
comment
У меня есть только ОДИН старый начальный индекс ... что, если бы я удалил элементы из позиции индекса 3, 6 или 9 в качестве примера? - person user1202434; 02.05.2012
comment
@ user1202434 Событие будет запускаться несколько раз, или, если элементы являются смежными, например 3, 4, 5, используйте OldItems.Count для определения количества, начиная с начального индекса. Что-то вроде var manyIndexes = Enumerable.Range(e.OldStartingIndex, e.OldItems.Count); - person vcsjones; 02.05.2012
comment
Вы можете получить их с помощью e.OldItems? - person Turbot; 02.05.2012

да. OldStartingIndex в NotifyCollectionChangedEventArgs - это индекс, из которого был удален элемент.

person sblom    schedule 02.05.2012

Аргумент события e имеет свойства OldItems и OldStartingIndex. Может это поможет?

person Olivier Jacot-Descombes    schedule 02.05.2012
comment
Да, но если я удалю несколько элементов, этого не произойдет. Мне нужно знать все индексы, которые были удалены. - person user1202434; 02.05.2012
comment
Спасибо, Оливер ... Это действительно помогает. - person user1202434; 02.05.2012
comment
Я вижу только методы Remove(item), RemoveAt(index) и Clear() в ObservableCollection<T>. Как вы хотите сразу удалить элементы из несмежных позиций? Вероятно, вам придется удалять их один за другим, и событие CollectionChanged будет вызываться один раз для каждого удаленного элемента. Или я что-то упускаю? - person Olivier Jacot-Descombes; 02.05.2012

Кажется, у вас сложилось впечатление, что вы можете удалить несколько элементов из ObservableCollection одним вызовом метода. Это невозможно. Вы должны вызвать Remove, RemoveAt или RemoveItem, и все они удаляют только один элемент из коллекции. Это означает, что каждый раз, когда элемент удаляется из коллекции, событие remove будет срабатывать, и OldStartingIndex и OldItems будут содержать ссылку на индекс одного элемента, который был удален, и массив отдельных элементов одного элемента соответственно.

Вы не можете выполнить поиск в коллекции, используя OldStartingIndex, как вы отметили, потому что он был удален. Если вам нужен доступ к элементу, на который была ссылка в оригинале, вы можете использовать OldItems и взять первый элемент.

Я не использовал ObservableCollection, но единственный способ удалить более одного элемента за один раз - это вызвать Clear или ClearItems. Если бы они запускали измененное событие, я бы предположил, что OldStartingIndex будет 0, а OldItems будет содержать ссылку на все элементы, которые ранее были в коллекции.

person Kevin Brock    schedule 02.05.2012