从silverlight中的observablecollection中删除多个项目

时间:2012-11-20 11:35:03

标签: c# silverlight mvvm

如何从silverlight中的observablecollection中删除多个项目。在我的项目中,我有一个数据网格填充多个项目。每行包含一个复选框。如果我通过选择复选框选择多行并单击删除按钮,我想删除集合中的所有项目。

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

导致错误。不能改变observablecollection

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:6)

我认为错误消息有点不同。更确切地说,它是:

  

收藏被修改;枚举操作可能无法执行。

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

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

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

在调用Where之前使用ToList会将您复制到新列表的引用数量减少到只需要复制的引用数量。

答案 2 :(得分:0)

只需获取首先包含的对象列表:

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

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