【问题标题】:Remove selected items from Listbox (ObservableCollection)从列表框中删除选定的项目 (ObservableCollection)
【发布时间】:2014-01-19 17:58:20
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c# wpf observablecollection


【解决方案1】:

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

解释:

当您从 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]);}
  • 是的,如果您只想删除单个项目,这将起作用。
【解决方案2】:

例如,当尝试修改绑定到 ListBox 的 ObservableCollection&lt;T&gt; 时,就会发生这种情况。你就是这样处理的:

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&lt;T&gt;,并使用与您尝试修改的集合相同的T。
  2. 遍历 ListBox 中的 SelectedItems 节点。将他们添加到itemsToRemove。
  3. 遍历itemsToRemove。将 ListBox ItemsSource 转换为 ObservableCollection&lt;T&gt; 并从中删除 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即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多