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

3
我正在尝试从一个绑定到ObservableCollection的ListBox中删除选定的项目。
var selectedFiles = MyList.SelectedItems;
foreach (cListEntry item in selectedFiles)
{
   _myList.Remove(item);
}

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

应该如何正确处理?


2
https://dev59.com/9HRB5IYBdhLWcg3wgHWr - Soner Gönül
特别注意,阅读此评论.. https://dev59.com/9HRB5IYBdhLWcg3wgHWr#MKGdEYcBWogLw_1btcee - Soner Gönül
2个回答

6

如异常所示,您不能在枚举集合时修改它。

解释:

当您从ObservableCollection中删除项时,MyList.SelectedItems将更新,因为ObservableCollection实现了INotifyCollectionChanged。 现在,selectedFiles正在指向同一个引用,这导致其被修改。

解决方法:

相反,创建一个新列表并枚举该列表,以便ObservableCollection的任何更改都不会反映回您正在枚举的列表。这样做可以解决问题:

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

感谢您的解释和解决方案。我之前并不知道这个。这看起来也可以:如果 (MyList.SelectedItems.Count != 0) {_myList.Remove((cListEntry)MyList.SelectedItems[0]);} - Daniel
如果你只想删除单个项目,这将起作用。 - Rohit Vats

1
当尝试修改绑定到 ListBox 的 ObservableCollection 时,就会出现这种情况。以下是处理方法:
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. 创建一个名为itemsToRemove的新ObservableCollection<T>,其中T与您要修改的集合相同。
  2. 遍历ListBox中SelectedItems的节点。将它们添加到itemsToRemove
  3. 遍历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即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接