我正在尝试删除绑定到ObservableCollection的ListBox中的所选项。
var selectedFiles = MyList.SelectedItems;
foreach (cListEntry item in selectedFiles)
{
_myList.Remove(item);
}
“集合已修改;枚举操作可能无法执行”
这样做的正确方法是什么?
答案 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);
}
ObservableCollection<T>
的新itemsToRemove
,与您尝试修改的收藏集相同T
。itemsToRemove
。itemsToRemove
。将ListBox ItemsSource转换为ObservableCollection<T>
并从中移除itemsToRemove
中的匹配项。参考: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。