通过在数据网格中选择条目,从可观察集合中删除条目

本文关键字:删除 集合 观察 选择 数据 数据网 网格 | 更新日期: 2023-09-27 18:33:49

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

当我尝试我的方式时,我收到一个错误"集合已修改;枚举操作可能无法执行。

我知道错误是由我引起的,因为我正在循环更改集合,我做了一些研究并试图应用我发现的东西,但我似乎可以让它工作。

如何创建集合并将其绑定到数据网格

 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;
        }
    }

通过在数据网格中选择条目,从可观察集合中删除条目

我相信

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

尝试替换该行:

var x = ToCopy.SelectedItems;

跟:

var x = ToCopy.SelectedItems.OfType<XbmcInfo>().ToArray();
<</div> div class="answers">

我会这样做的方式:

  • 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>

您正在做的是说 数据网格 (具有 IsSelected) 的项绑定到您的属性。

试一试...代码可能会有一些错误,但它的起源是存在的:)

问候