通过在数据网格中选择条目来从ObservableCollection中删除条目

时间:2013-10-03 13:09:29

标签: c# wpf datagrid

我有一个绑定到可观察集合的数据网格。 我想在数据网格中选择几行,然后单击一个按钮,从集合中删除这些行。

当我按照我的方式尝试时,我收到错误“收集被修改;枚举操作可能无法执行。

我知道错误是由于错误造成的,因为我正在循环改变收藏品我做了一些研究并尝试应用我发现但我似乎可以让它起作用。

我如何制作集合并将其绑定到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);
            }
        }

这是datagrid的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;
        }
    }

2 个答案:

答案 0 :(得分:1)

我认为问题是在迭代时修改SelectedItems集合。

尝试替换该行:

var x = ToCopy.SelectedItems;

使用:

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

答案 1 :(得分:0)

我会这样做:

  • XbmcInfo:在Datagrid.record中添加一个属性IsSelected绑定到选定的属性
  • Button_Click_1:迭代在SelectedShowSeason.Where(x =&gt; 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);
    }

=================== EDIT ===================

要将属性绑定到数据网格,可以为datagrid中的项添加样式。

这样的事情:

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

这种“ItemsSelected”风格将是这样的:

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

您正在做的是说数据网格中具有IsSelected的项目会绑定到您的媒体资源。

尝试一下......代码可能有一些错误,但它的起源就在那里:)

此致