从列表框中删除所选项目(ObservableCollection)

时间:2014-01-19 17:58:20

标签: c# wpf observablecollection

我正在尝试删除绑定到ObservableCollection的ListBox中的所选项。

var selectedFiles = MyList.SelectedItems;
foreach (cListEntry item in selectedFiles)
{
   _myList.Remove(item);
}
  

“集合已修改;枚举操作可能无法执行”

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

在枚举时无法修改集合,从异常本身就可以看出。

说明:

当您从ObservableCollection中删除项目时, MyList.SelectedItems 会更新,因为ObservableCollecton实现 INotifyCollectionChanged 。 现在,selectedFiles指向同一个引用,导致修改它。

解决方案

而是创建一个新列表并对其进行枚举,以便ObservableCollection中的任何更改都不会反映回您要枚举的列表。这将有效:

var selectedFiles = MyList.SelectedItems.Cast<object>().ToList();
foreach (cListEntry item in selectedFiles)
{
   _myList.Remove(item);
}

答案 1 :(得分:1)

例如,在尝试修改绑定到ListBox的ObservableCollection<T>时会发生这种情况。这就是你如何处理:

ObservableCollection<Employee> itemsToRemove = new ObservableCollection<Employee>();

foreach (Employee item in lsbxNames.SelectedItems)
{
    itemsToRemove.Add(item);
}
foreach (Employee item in itemsToRemove)
{
    ((ObservableCollection<Employee>)lsbxNames.ItemsSource).Remove(item);
}
  1. 创建一个名为ObservableCollection<T>的新itemsToRemove,与您尝试修改的收藏集相同T
  2. 遍历ListBox中SelectedItems的节点。将它们添加到itemsToRemove
  3. 遍历itemsToRemove。将ListBox ItemsSource转换为ObservableCollection<T>并从中移除itemsToRemove中的匹配项。
  4. 参考:http://docs.telerik.com/devtools/wpf/controls/radgridview/managing-data/deleting-entry

    所以这意味着你应该能够做到这一点:

    ObservableCollection<cListEntry> itemsToRemove = new ObservableCollection<cListEntry>();
    
    foreach (cListEntry item in MyList.SelectedItems)
    {
        itemsToRemove.Add(item);
    }
    foreach (cListEntry item in itemsToRemove)
    {
        ((ObservableCollection<cListEntry>)MyList.ItemsSource).Remove(item);
    }
    

    我不确定_myList是什么,但你不需要修改它。直接进入ListBox。