2014-01-19 6 views
1

ObservableCollection에 바인딩 된 ListBox에서 선택한 항목을 제거하려고합니다.목록 상자 (ObservableCollection)에서 선택한 항목 제거

var selectedFiles = MyList.SelectedItems; 
foreach (cListEntry item in selectedFiles) 
{ 
    _myList.Remove(item); 
} 

"컬렉션이 수정되었다 열거 작업이 실행되지 않을 수 있습니다"

이 일을 적절한 방법은 무엇입니까?

+2

http://stackoverflow.com/questions/604831/collection-was-modified-enumeration-operation-may-not-execute –

+0

특히,이 댓글을 읽고 .. http://stackoverflow.com/questions/604831/ collection-was-modified-enumeration-operation-may-execute # comment13168776_604843 –

답변

3

은 예외 자체에서 명백한 것처럼을 열거하면서 컬렉션을 수정할 수 없습니다.

는 설명 : ObservableCollecton 이후이 업데이트를 얻을 수

당신이 ObservableCollection에에서 항목을 제거, MyList.SelectedItems이 구현은을 INotifyCollectionChanged. 이제 selectedFiles가 수정 된 동일한 참조를 가리키고 있습니다.

솔루션 대신 새 목록을 만들고 ObservableCollection에 어떤 변화가 다시이 열거되어 목록에 반영하지 않도록하는 것이 이상 열거. 이것은 작동합니다 : 예를 들어, 목록 상자에 바인딩 된 ObservableCollection<T>을 수정하려고 할 때이 문제가 발생

var selectedFiles = MyList.SelectedItems.Cast<object>().ToList(); 
foreach (cListEntry item in selectedFiles) 
{ 
    _myList.Remove(item); 
} 
+0

설명과 해결책을 가져 주셔서 감사합니다. 나는 그 사실을 몰랐다. – Daniel

+0

예, 하나의 항목 만 제거하려는 경우에도 사용할 수 있습니다. 정답은 –

+1

+1입니다. :) –

0

합니다. 이것은 당신이 그 처리 방법은 다음과 같습니다

ObservableCollection<Employee> itemsToRemove = new ObservableCollection<Employee>(); 

foreach (Employee item in lsbxNames.SelectedItems) 
{ 
    itemsToRemove.Add(item); 
} 
foreach (Employee item in itemsToRemove) 
{ 
    ((ObservableCollection<Employee>)lsbxNames.ItemsSource).Remove(item); 
} 
  1. 새로운 ObservableCollection<T>가 수정하려는 컬렉션과 같은 T으로 itemsToRemove라는 만듭니다.
  2. ListBox의 SelectedItems 노드를 반복합니다. 그들을 itemsToRemove에 추가하십시오.
  3. itemsToRemove까지 반복합니다. ListBox ItemsSource를 ObservableCollection<T>으로 전송하고 일치 항목을 itemsToRemove에서 제거하십시오.

참조 : http://docs.telerik.com/devtools/wpf/controls/radgridview/managing-data/deleting-entry

그래서 이것은 당신이 할 수 있어야 의미 :

ObservableCollection<cListEntry> itemsToRemove = new ObservableCollection<cListEntry>(); 

foreach (cListEntry item in MyList.SelectedItems) 
{ 
    itemsToRemove.Add(item); 
} 
foreach (cListEntry item in itemsToRemove) 
{ 
    ((ObservableCollection<cListEntry>)MyList.ItemsSource).Remove(item); 
} 

내가 _myList이 무엇인지 확실하지 않다, 그러나 당신이 그것을 수정할 필요가 없습니다 . 그냥 직접 ListBox로 이동하십시오.