如何从silverlight中的observablecollection中删除多个项目。在我的项目中,我有一个数据网格填充多个项目。每行包含一个复选框。如果我通过选择复选框选择多行并单击删除按钮,我想删除集合中的所有项目。
public void delete(object parameter)
{
foreach (var x in Book)
{
if (x.Ischeck == true)
{
Book.Remove(x);
}
}
}
导致错误。不能改变observablecollection
答案 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(),您首先枚举整个集合,将其存储在列表中,然后检查要删除的内容。