2012-11-20 23 views
3

拆除的ObservableCollection多个项目如何从的ObservableCollection删除多个项目在silverlight.in项目中,我有一个数据网格填充多个items.in每一行都包含一个复选框also.if我选择由多行选择复选框并点击删除按钮,我想删除集合中的所有项目。在Silverlight

public void delete(object parameter) 
    { 
     foreach (var x in Book) 
     { 
       if (x.Ischeck == true) 
       { 
        Book.Remove(x); 
        } 
     } 
    } 

它导致error.can't变化的ObservableCollection

+0

的可能重复(http://stackoverflow.com/ [如何从Silverlight中的ObservableCollection删除custome项目]问题/ 13339068 /如何去除的-custome项从 - 的ObservableCollection功能于Silverlight的) –

回答

12

您可以使用下面提及的代码片段,而不是:

foreach (var x in Book.ToList()) 
{ 
    if (x.Ischeck) 
    { 
     Book.Remove(x); 
    } 
} 

OR

for (int i = Book.Count - 1; i >= 0; i--) 
{ 
    if (Book[i].Ischeck) 
    { 
     Book.RemoveAt(i); 
    } 
} 
+0

Thanks..U保存可能每天..两个工作.. – nichu09

0

只需获得对象的列表包含第一:

public void delete(object parameter) 
{ 
    foreach (var x in Book.ToList()) 
    { 
     if (x.Ischeck == true) 
     { 
      Book.Remove(x); 
     } 
    } 
} 

这样做的原因是,你不能删除元素一个可观察的集合,同时列举元素。通过调用ToList(),首先枚举整个集合,将其存储在列表中,然后检查要删除的内容。

+0

谢谢...它的工作.. – nichu09

6

我假设错误信息有点不同。更确切地说,它是:

收藏被修改;枚举操作可能不会执行。

要解决此问题,一个可能的解决方案是这样的:

foreach (var itemToRemove in Book.Where(x => x.Ischeck).ToList()) 
{ 
    Book.Remove(itemToRemove); 
} 

这将让你想删除并把它们放到一个新的列表中的所有项目。当您现在从Book中移除项目时,您并不会打扰您当前正在迭代的列表,因为这是一个独立的实例。

调用ToList之前使用Where减少您复制到新的名单,只有那些真正需要复制引用的数量。

+0

@daniel ..感谢我得到了上述错误exactly..u拯救我的一天。 – nichu09