2013-10-03 4 views
0

관찰 가능한 컬렉션에 바인딩 된 데이터 표가 있습니다. 데이터 그리드에서 몇 개의 행을 선택하고 단추를 클릭하여 해당 행을 컬렉션에서 제거하려고합니다.ObservableCollection에서 데이터 그리드에서 항목을 선택하여 항목 제거

내 방식대로 시도하면 오류가 발생합니다. "컬렉션이 수정되었습니다. 열거 연산이 실행되지 않을 수 있습니다. "

나는 몇 가지 조사를 해본 결과 내가 적용된 것을 적용하려고 노력했지만 반복적으로 반복하고 있기 때문에 오류가 발생한다는 것을 알고있다. 내가 컬렉션을 내가 컬렉션에서 값을 제거하려고 어떻게에서 Datagrid

ObservableCollection<XbmcInfo> SelectedShowSeason = new ObservableCollection<XbmcInfo>(); 
ToCopy.DataContext = SelectedShowSeason; 

에 바인딩하는 방법

private void Button_Click_1(object sender, RoutedEventArgs e) 
     { 
      var x = ToCopy.SelectedItems; 
      foreach (XbmcInfo f in x) 
      { 
       string ShowName = f.ShowName; 
       string ShowSeasonNumber = f.Number; 

       var Selected = SelectedShowSeason.FirstOrDefault(u => u.ShowName == ShowName && u.Number == ShowSeasonNumber); 

       SelectedShowSeason.Remove(Selected); 
      } 
     } 

이것은 데이터 그리드에 대한 XML이다

<DataGrid Name="ToCopy" AutoGenerateColumns="False" ItemsSource="{Binding}" Margin="0,0,0,51" Grid.Row="2" Grid.ColumnSpan="3" IsReadOnly="True" CanUserResizeRows="False" CanUserReorderColumns ="False" IsSynchronizedWithCurrentItem="True"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="ShowName" Width="*" Binding="{Binding Path=ShowName}" /> 
       <DataGridTextColumn Header="Season" Width="50" Binding="{Binding Path=Number}" /> 
       <DataGridTextColumn Header="Path" Width="*" Binding="{Binding Path=Path}"/> 
      </DataGrid.Columns> 
    </DataGrid> 

내 클래스

public class XbmcInfo 
    { 
     public string ShowName 
     { 
      get; 
      set; 
     } 

     public string Number 
     { 
      get; 
      set; 
     } 

     public string Path 
     { 
      get; 
      set; 
     } 
    } 
+0

그리고 무엇을 줘? 당신은 어떻게 바인딩을합니까? – sexta13

+0

질문에서 제거하는 방법은 ... 여전히 오류를 던지고 있습니까?이 컬렉션을 통해 반복하지 않으므로? – Nitin

답변

0

나는 그것을 할 것입니다 방법 :

라인을 교체 시도

  • XbmcInfo : 속성을 추가하는 것은에서 Datagrid에서 선택한 속성에 바인딩에 isSelected .record
  • Button_Click_1 : SelectedShowSeason.W에서 반복합니다. 여기 (x => x.IsSelected); 그런 다음 항목을 제거하십시오.

다른 방법으로, 처음부터 끝까지 반복하는 것입니다 :

 for(int i=x.Count; i>0;i--) { 
string ShowName = x[i].ShowName; 
       string ShowSeasonNumber = x[i].Number; 

var Selected = SelectedShowSeason.FirstOrDefault(u => u.ShowName == ShowName && u.Number == ShowSeasonNumber); 

         SelectedShowSeason.Remove(Selected); 
    } 

=================== 편집 ===== ==============

DataGrid에 속성을 바인딩하려면 DataGrid에서 항목의 스타일을 추가 할 수 있습니다. 이 같은

뭔가 :

<Datagrid..... ItemContainerStyle = {StaticResource ItemsSelected} /> 

이 스타일은 다음과 같이 될 것 "ItemsSelected"

<Style> 
<Setter Property = "IsSelected" Value = "{Binding Path=IsSelected}"/> 
</Style> 

당신이 말하는 일을하는에 isSelected을 가지고있는 데이터 그리드 내부의 항목, 귀하의 재산에 귀속됩니다.

는 그것에게 XAML에 대한 시도 ... 코드가 약간의 오차가있을 수 있지만, 그것의 기원이

감사가 :)입니다

+0

내 수업을 추가했으면 "XbmcInfo : Datagrid.record에서 선택한 속성에 바인딩 된 속성 IsSelected 속성을 추가하십시오" – justinf

+0

편집 할 것입니다. 그러나 스타일이 있습니다 ... – sexta13

+0

Ok thanks 나는이 솔루션을 가지고 갈 것이다. 왜냐하면 내가 나중에 염두에 두어야 할 몇 가지 도움이 될 것이기 때문이다. – justinf

1

나는 문제가 그것을 반복하면서 SelectedItems 모음을 수정 믿습니다.

var x = ToCopy.SelectedItems; 

으로 :

var x = ToCopy.SelectedItems.OfType<XbmcInfo>().ToArray(); 
+0

고마워. 나는 이것도 잘 돌아갈 것이지만, sexta13의 해결책은 내가보고있는 다른 것들에 도움이 될 것이다. – justinf

관련 문제