2016-02-03 2 views
0

У меня есть ObservableCollection, который привязан к ItemsControl, как к ItemsSource (режим TwoWay). Для какой-то странной проблемы прокрутки мне пришлось придумать взломать все элементы из этой коллекции, прежде чем устанавливать ее снова. Потому что, если я переустановил эту коллекцию, я столкнулся с этой проблемой прокрутки (которая не стоит объяснять здесь, я полагаю). Так вот что я делаю:Ошибка HRESULT E_FAIL была возвращена из вызова COM-компонента при удалении элементов из ObservableCollection

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(), так как это приводит к той же проблеме прокрутки, с которой я пытаюсь работать.

ответ

0

Первый из HRESULT E_FAIL не является хорошим провалом, так как он может иметь много источников. Но в вашем случае это действительно очень просто.

Вы преобразовали свою коллекцию в список, чтобы перебирать ее с помощью foreach. В вашем foreach вы хотите удалить элемент из своего списка. Но это все еще упоминается в Списке, и порядок списка заблокирован интеркатором foreach. Чтобы решить эту проблему, вам нужно очистить свою коллекцию/список в цикле for, где ни один итератор не блокирует ссылочный список.

EDIT

Еогеасп .... итерационная переменная {...} LOCKED

Так до тех пор, пока вы находитесь в цикле Еогеасп итератор переменной вы хотите пройти, как список с объектами, порядок и подсчет списка заблокированы. Таким образом, вы не можете удалить, добавить элементы в список, потому что итератор блокирует его. Это необходимо, потому что в противном случае итератор сказал бы, что следующий элемент - это H, но на самом деле это G, и вы пропускаете G, потому что итератор ошибочен, потому что вы манипулировали списком. Вот почему он заблокирован.

Collection.ToList создает новый список со ссылочными элементами в коллекцию. Поэтому, когда Iterator блокирует список, коллекция также заблокирована.

Для удаления элементов в настоящее время, вы должны сделать это таким образом

for(int i = 0; i ++; i < List.Count()) 
{ 
     collection.removeat(i) 
} 
+0

Я не очень уверен, если я понимаю, что вы только что сказали. Некоторый код был бы оценен. Благодарю. – tavier

+0

отредактировал мой ответ –

+0

Он дает «System.ArgumentOutOfRangeException», поскольку та же коллекция изменяется (при удалении элементов). Поэтому в следующий раз, когда он войдет внутрь, чтобы удалить элемент в индексе say 2, элемент, возможно, был перенесен в индекс 1. Я исправлю это и посмотрю, работает ли это. – tavier