2014-01-19 74 views
1

我试图删除绑定到ObservableCollection的列表框中的选定项目。从列表框(ObservableCollection)中删除选定的项目

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

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

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

+2

http://stackoverflow.com/questions/604831/collection-was-modified-enumeration-operation-may-not-execute –

+0

特别是,阅读此评论.. http://stackoverflow.com/questions/604831/ collection-was-modified-enumeration-operation-may-not-execute#comment13168776_604843 –

回答

3

您从无法修改集合,而列举它时,从异常本身可以看出它是

说明:

当您从的ObservableCollection删除项目,MyList.SelectedItems得到更新,因为ObservableCollecton实施INotifyCollectionChanged。 现在,selectedFiles指向相同的引用,导致修改它。

解决方案

而是创建一个新的列表和枚举,如此,在任何的ObservableCollection变化并不反映回你所列举清单。这将工作:

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

谢谢你的解释和解决方案。我没有意识到这一点。这也似乎工作MyList.SelectedItems.Count!= 0){_ myList.Remove((cListEntry)MyList.SelectedItems [0]);} – Daniel

+0

是的,如果你只想删除单个项目,这将工作。 –

+1

+1以获得正确答案。 :) –

0

例如,当试图修改绑定到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中的匹配项。

参考: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。