2012-01-19 4 views
3

У меня есть WPF ListView со многими элементами в нем. Когда я выбираю несколько из них, я хочу удалить их с помощью кнопки. Проблема, которую я испытываю, заключается в том, что я могу удалить ОДИН элемент из ListView, но затем, когда я повторю второй раз, я получаю:Как удалить несколько выбранных элементов из списка WPF ListView?

Коллекция была изменена; операция перечисления может не выполняться.

Ошибка из-за последнего удаления, модифицирующего ItemSourceListView. Каков наилучший способ сделать это? Я попытался сделать копию выбранных элементов, но я не знаю, какой тип использовать.

ответ

2

Сохраните коллекцию выбранных элементов в локальной переменной, которая не изменится, и вы можете без проблем перебирать ее.

например.

var selected = lv.SelectedItems.Cast<Object>().ToArray(); 
foreach (var item in selected) lv.Items.Remove(item); // or whereever you need to remove them... 

(Cast<T> и ToArray являются extension methods)

+1

SelectedItems не имеет метода с ToArray(). Я не могу понять, какой тип использовать для локальной переменной. – joepetrakovich

+4

ListView.SelectedItems - это System.Collections.IList и, следовательно, не имеет метода ToArray. Но вы можете написать: var selected = new ArrayList (listBox.SelectedItems); – Clemens

+0

Вот и все! Спасибо. – joepetrakovich

1

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

Тип источника вашей коллекции связан с вашим ListView?

+0

Это ObservableColletion . – joepetrakovich

+0

Этот ответ является наиболее правильным - вам нужно управлять Listview через коллекцию, к которой она привязана. Вы получите исключение иначе –

1

моего Предпочитаемый способ сделать это состоит в использовании диспетчера:

System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke((Action)(() => 
     { 
      my_Collection.Remove(item); 
     })); 
+2

Да, это приведет к асинхронному удалению одного элемента. Вопрос состоял в том, как удалить несколько из них. Вы, надеюсь, не будете делать это асинхронно один за другим. – Clemens

Смежные вопросы