WPF DataGrid C#ObservableCollection.Insert()被选中
我的DataGrid中有以下行为: 我的网格中有一个可观察的集合。MyType包含为INotifyPropertyChanged实现的IsSelected属性。当我只使用myGrid.Add(newItem)时,这很好用 但是只要我使用myGrid.Insert(index,newItem);如果索引不是最后一个位置,则不再设置IsSelected属性。 因此,无法移除这些项目 我使用IsSelected作为removeButton,以便可以从myGrid中删除所选项目。 我想插入行以按逻辑顺序显示条目 有人看到这一点并找到了解决方案吗?我在网上找不到答案。 我的解决方法是清除ObservableCollection并按正确的顺序添加所有项 我正在使用.NETFramework4.8 编辑:仅正确选择第一个插入项的小示例 缅因州的WPF: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中删除所选项目。 我想插入行以按逻辑顺序
<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||
选择列表。