C# 从ObservableCollection中删除项时,调用COM组件返回错误HRESULT E_FAIL

C# 从ObservableCollection中删除项时,调用COM组件返回错误HRESULT E_FAIL,c#,data-binding,observablecollection,C#,Data Binding,Observablecollection,我有一个ObservableCollection,它作为ItemsSource(双向模式)绑定到ItemsControl。对于一些奇怪的滚动问题,我不得不想出一种方法,在重新设置之前删除此集合中的所有项目。因为如果我重新整理这个集合,我会遇到滚动问题(我想这不值得在这里解释)。下面是我的工作: var itemsToRemove = MyCollection.ToList(); foreach (var itemToRemove in itemsToRemove) { MyCollect

我有一个ObservableCollection,它作为ItemsSource(双向模式)绑定到ItemsControl。对于一些奇怪的滚动问题,我不得不想出一种方法,在重新设置之前删除此集合中的所有项目。因为如果我重新整理这个集合,我会遇到滚动问题(我想这不值得在这里解释)。下面是我的工作:

var itemsToRemove = MyCollection.ToList();
foreach (var itemToRemove in itemsToRemove)
{
    MyCollection.Remove(itemToRemove);
}
// Add items to the collection
尝试从此集合中删除项目时出现此错误:
错误HRESULT E\u FAIL已从对COM组件的调用中返回。仅当集合相对较大(超过10个项目)时才会发生,并且不会发生在第一个项目上,而是发生在集合中间的某些项目上(可能与绑定有关?)


注意:我不能使用MyCollection.Clear()
,因为它会导致与我尝试解决的滚动问题相同的问题。

第一个HRESULT E_失败不是一个好的失败,因为它可能有许多源。但对你来说,这其实很简单

您已将集合转换为列表,以便使用foreach对其进行迭代。在foreach中,您希望从列表中删除一项。但是这仍然在列表中被引用,并且列表的顺序被foreach interator锁定。所以要解决这个问题,您需要在for循环中清除集合/列表,其中没有迭代器阻止引用的列表

编辑

foreach。。。。迭代器变量 {…锁定}

因此,只要您处于foreach循环中,您希望遍历的变量的迭代器(如带有对象的列表)就会锁定列表的顺序和计数。因此,您无法在列表中删除、添加项,因为迭代器将其锁定。这是必需的,因为否则迭代器会说下一个元素是H,但实际上是G,而您跳过了G,因为迭代器是错误的,因为您操纵了列表。这就是它被锁的原因

collection.ToList创建一个新列表,其中包含引用到集合的项。因此,当迭代器锁定列表时,集合也被锁定

要现在删除元素,必须这样做

for( int i = 0; i ++; i < List.Count())
{
      collection.removeat(i)
}
for(int i=0;i++;i
我不太确定我是否理解你刚才说的话。一些代码将不胜感激。谢谢。它给出了“System.ArgumentOutOfRangeException”,因为同一集合正在被修改(删除项时)。所以下一次当它进去移除索引2处的项时,该项可能已经移动到索引1。我会修复这个问题,看看它是否有效。所以我做了如下操作:for(int I=itemsToRemove.Count-1;I>=0;I--){MyCollection.RemoveAt(I);}但它给出了相同的异常错误HRESULT E_FAIL已从对COM组件的调用中返回,因此如果仍然发生相同的错误,对不起,我回答错了。请您在删除代码周围放置一个try-catch块,这样我们可以更好地了解错误,因为您提到的错误是与COM相关的错误,并且没有告诉我们下面发生的事情。奇怪的是,我现在执行完全相同的流并没有看到这个错误。这让我怀疑这是否与时间问题有关。由于此集合绑定为items控件(flipview)的项目源。