2010-12-07 9 views
2

구성 집합을 관리하는 WPF 창이 있으며 구성 집합 (편집 단추)을 편집하고 구성 집합 (제거 단추)을 제거 할 수 있습니다. 이 창에는 이름별로 구성 집합을 나열하는 ListBox 컨트롤이 있으며 해당 ItemsSource에는 구성 집합 목록에 바인딩 집합이 있습니다. 나는 윈도우의 파일 뒤에 코드에서 항목을 제거하기 위해 노력하고있어ListBox 항목 제거

..

private void RemoveButton_Click(object sender, RoutedEventArgs e) 
{ 
    var removedItems = configSetListBox.SelectedItems; 

    foreach(ConfigSet removedItem in removedItems) 
    { 
     configSetListBox.Items.Remove(removedItem); 
    } 
} 

내 코드라는 잘못된 연산 예외를 얻을 "액세스 대신 ItemsControl.ItemsSource와 요소를 수정할 수 있습니다." ListBox에서 항목을 올바르게 제거하려면 어떤 속성에 액세스해야합니까? 아니면 WPF에서 이것을 처리하는 좀 더 우아한 방법이 있을까요? 내 경우

솔루션

private void RemoveButton_Click(object sender, RoutedEventArgs e) 
{ 
    foreach(ConfigSet removedItem in configSetListBox.SelectedItems) 
    { 
     (configSetListBox.ItemsSource as List<ConfigSet>).Remove(removedItem); 
    } 
    configSetListBox.Items.Refresh(); 
} 

을 :) 것이다 나는 그런 식으로 캐스팅했다 있도록 ItemSource 바인딩 유형으로 목록이 있다면 내 구현은 비트의 WinForm 틱입니다. Items 컬렉션을 새로 고치지 않으면 ListBox가 업데이트되지 않습니다. 그래서 그것은 나의 해결책을 위해 필요했다.

+0

itemsource는 (는) 관찰 가능한 컬렉션입니까? –

+0

@vc, 그것의 목록 ​​ jlafay

답변

3

사용 :

private void RemoveButton_Click(object sender, RoutedEventArgs e) 
{ 
    foreach(ConfigSet item in this.configSetListBox.SelectedItems) 
    { 
     this.configSetListBox.ItemsSource.Remove(item); // ASSUMING your ItemsSource collection has a Remove() method 
    } 
} 

주 :이 내 사용. 그것이 더 명백한 것처럼 그저 그렇습니다. 이것은 또한 우리가있는 메소드의 변수와 반대로 객체가 클래스 네임 스페이스에있는 것을 보는데 도움이됩니다 - 여기서 명백합니다.

1

이것은 컬렉션을 반복하는 동안 컬렉션을 수정하기 때문입니다. 당신이 이미 여기에 대답 한 소스

0

에서 항목을 제거하려고보다 목록 상자의 항목 소스를 바인더 제본 한 경우

.

WPF - Best way to remove an item from the ItemsSource

당신은 당신의 목록 상자에 반영됩니다에 무슨 일이 있어도 다음 ObservableCollection에를 구현해야합니다.

+0

그 중 하나의 항목이 많지 않다 – markmnl

+0

Mrk Mnl이 표시하는 코드는 링크에서 온 것과 동일하지만 모든 것을 다루고 있습니다. – phillip

0

I이 논리를 사용하여 선행합니다. 그리고 효과가있었습니다.

시도하고 싶습니다.

private void RemoveSelectedButton_Click(object sender, RoutedEventArgs e) { 
     if (SelectedSpritesListBox.Items.Count <= 0) return; 

     ListBoxItem[] temp = new ListBoxItem[SelectedSpritesListBox.SelectedItems.Count]; 
     SelectedSpritesListBox.SelectedItems.CopyTo(temp, 0); 
     for (int i = 0; i < temp.Length; i++) { 
      SelectedSpritesListBox.Items.Remove(temp[i]); 
     } 
    }