WPF DataGrid C#ObservableCollection.Insert()被选中

WPF DataGrid C#ObservableCollection.Insert()被选中,c#,wpf,datagrid,insert,observablecollection,C#,Wpf,Datagrid,Insert,Observablecollection,我的DataGrid中有以下行为: 我的网格中有一个可观察的集合。MyType包含为INotifyPropertyChanged实现的IsSelected属性。当我只使用myGrid.Add(newItem)时,这很好用 但是只要我使用myGrid.Insert(index,newItem);如果索引不是最后一个位置,则不再设置IsSelected属性。 因此,无法移除这些项目 我使用IsSelected作为removeButton,以便可以从myGrid中删除所选项目。 我想插入行以按逻辑顺序

我的DataGrid中有以下行为:

我的网格中有一个可观察的集合。MyType包含为INotifyPropertyChanged实现的IsSelected属性。当我只使用myGrid.Add(newItem)时,这很好用

但是只要我使用myGrid.Insert(index,newItem);如果索引不是最后一个位置,则不再设置IsSelected属性。 因此,无法移除这些项目

我使用IsSelected作为removeButton,以便可以从myGrid中删除所选项目。 我想插入行以按逻辑顺序显示条目

有人看到这一点并找到了解决方案吗?我在网上找不到答案。 我的解决方法是清除ObservableCollection并按正确的顺序添加所有项

我正在使用.NETFramework4.8

编辑:仅正确选择第一个插入项的小示例

缅因州的WPF:

<Window x:Class="ObservableGridInserIsSelected.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ObservableGridInserIsSelected"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <DataGrid Grid.Row="0" Grid.ColumnSpan="2" Grid.Column="0" ItemsSource="{Binding MyGrid}"
                  AutoGenerateColumns="False">
                <DataGrid.Resources>
                <Style TargetType="DataGridRow">
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
                    <Setter Property="VerticalAlignment" Value="Center"/>
                    <Setter Property="VerticalContentAlignment" Value="Center"/>
                </Style>
            </DataGrid.Resources>
            <DataGrid.Columns>
                <DataGridTextColumn Header="IndexName" Binding="{Binding Name}"  IsReadOnly="True" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
        <Button Grid.Row="1" Grid.Column="0" x:Name="InsertAt0" Content="Insert at Index 0"/>
        <Button Grid.Row="1" Grid.Column="1" x:Name="RemoveSelected" Content="Remove Selected"/>
    </Grid>
</Window>

和主窗口CS:

using System.Windows;

namespace ObservableGridInserIsSelected
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var vm = new GridViewModel();
            DataContext = vm;
            InsertAt0.Click += new RoutedEventHandler(vm.AddButton_Click);
            RemoveSelected.Click += new RoutedEventHandler(vm.RemoveButton_Click);
        }
    }
}

使用System.Windows;
已选择命名空间ObservableGridSerised
{
/// 
///Interaktionslogik für MainWindow.xaml
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
var vm=新的GridViewModel();
DataContext=vm;
insert0.Click+=newroutedEventHandler(vm.AddButton\u Click);
RemoveSelected.Click+=新建路由EventHandler(vm.RemoveButton\u Click);
}
}
}
现在,“父”视图模型:

using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;

namespace ObservableGridInserIsSelected
{
    class GridViewModel
    {
        private int _usedItems = 0;
        ObservableCollection<GridElementViewModel> _myGrid = new ObservableCollection<GridElementViewModel>();
        public ObservableCollection<GridElementViewModel> MyGrid { get => _myGrid; set => _myGrid = value; }

        public GridViewModel()
        {

        }


        public void AddButton_Click(object sender, RoutedEventArgs e)
        {
            _myGrid.Insert(0, new GridElementViewModel("Item" + (_usedItems++)));
        }
        public void RemoveButton_Click(object sender, RoutedEventArgs e)
        {
            var selectedList = _myGrid.Where(x => x.IsSelected).ToList();
            if (selectedList == null ||
                selectedList.Count <= 0)
                return;

            foreach (var delItem in selectedList)
            {
                _myGrid.Remove(delItem);
            }
        }
    }
}

using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace ObservableGridInserIsSelected
{
    class GridElementViewModel : INotifyPropertyChanged
    {

        public bool IsSelected { get; set; }
        public string Name { get; set; }

        public GridElementViewModel(string name)
        {
            Name = name;
            IsSelected = false;
        }

        #region INotifyPropertyChanged implementation
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, e);
            }
        }

        protected void SetProperty<T>(ref T storage, T value, [CallerMemberName] string property = null)
        {
            if (Object.Equals(storage, value)) return;
            storage = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        }

        protected void SetProperty(string property = null)
        {

            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
        #endregion
    }
}

使用System.Collections.ObjectModel;
使用System.Linq;
使用System.Windows;
已选择命名空间ObservableGridSerised
{
类GridViewModel
{
私有int_usedItems=0;
ObservableCollection_myGrid=新的ObservableCollection();
公共ObservableCollection MyGrid{get=>\u MyGrid;set=>\u MyGrid=value;}
公共GridViewModel()
{
}
public void AddButton_单击(对象发送者,路由目标)
{
_插入(0,新的GridElementViewModel(“项”+(\u usedItems++));
}
公共无效删除按钮\单击(对象发送方,路由目标)
{
var selectedList=_myGrid.Where(x=>x.IsSelected.ToList();
如果(selectedList==null||
选择列表。