0

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

当我按照自己的方式尝试时,我得到一个错误“<strong>Collection was modified; 枚举操作可能无法执行。”

我知道错误是造成的,因为我正在循环更改集合,我做了一些研究并尝试应用我发现的内容,但我似乎可以让它工作。

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

2 回答 2

1

我相信问题是SelectedItems在迭代它时修改集合。

尝试更换线路:

var x = ToCopy.SelectedItems;

和:

var x = ToCopy.SelectedItems.OfType<XbmcInfo>().ToArray();
于 2013-10-03T13:18:10.923 回答
0

我会这样做的方式:

  • XbmcInfo:添加属性 IsSelected 绑定到 Datagrid.record 中的选定属性
  • Button_Click_1:在 SelectedShowSeason.Where(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..... ItemContainerStyle = {StaticResource ItemsSelected} />

这种“ItemsSelected”样式将是这样的:

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

您正在做的是说 datagrid 中具有 IsSelected 的项目绑定到您的属性。

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

问候,

于 2013-10-03T13:19:57.227 回答