从 ObservableCollection 中删除项时,从对 COM 组件的调用返回错误 HRESULT E_FAIL
本文关键字:返回 调用 错误 HRESULT FAIL 组件 COM 删除 ObservableCollection 从对 | 更新日期: 2023-09-27 18:32:57
我有一个ObservableCollection,它绑定到ItemsControl,因为它是ItemsSource(双向模式(。对于一些奇怪的滚动问题,我不得不想出一个技巧来删除此集合中的所有项目,然后再设置它。因为如果我重新实例化这个集合,我会遇到滚动问题(我想这不值得在这里解释(。所以我是这样做的:
var itemsToRemove = MyCollection.ToList();
foreach (var itemToRemove in itemsToRemove)
{
MyCollection.Remove(itemToRemove);
}
// Add items to the collection
尝试从此集合中删除项目时出现此错误:Error HRESULT E_FAIL has been returned from a call to a COM component
.仅当集合相对较大(超过 10 个项目(时才会发生,并且它不会发生在第一个项目上,而是发生在集合中间的某个项目上(可能与绑定有关?
注意:我无法使用MyCollection.Clear()
因为它会导致我正在尝试解决的相同滚动问题。
HRESULT E_FAIL的第一个不是一个好的失败,因为它可以有很多来源。但在你的情况下,它实际上非常简单。
您已将收藏集转换为列表,以便使用 foreach 循环访问它。在您的 foreach 中,您希望从列表中删除一个项目。但这仍然在列表中引用,并且列表的顺序由 foreach 交互器锁定。因此,要解决此问题,您需要在 for 循环中清除您的集合/列表,其中没有迭代器阻止引用的列表。
编辑
呵呵....迭代器变量{...已锁定}
所以只要你在foreach循环中,你想要通过的变量的迭代器,就像一个有对象的列表,列表的顺序和计数都是锁定的。因此,您无法删除,在列表中添加项,因为迭代器会锁定它。这是必需的,因为否则迭代器会说下一个元素是 H,但实际上它是 G,你跳过 G,因为迭代器是错误的,因为你操纵了列表。这就是它被锁定的原因。
集合。ToList 创建一个新列表,其中包含对集合的引用项。因此,当迭代器锁定列表时,集合也会被锁定。
现在要删除元素,您必须这样做
for( int i = 0; i ++; i < List.Count())
{
collection.removeat(i)
}