C# 删除选定行后,DataGrid的SelectedItems和突出显示的行将不同步
我有DataGrid,其中ItemsSource绑定到ViewModel中的ObservableCollection。DataGrid允许选择多行。ViewModel订阅某个服务中的事件,处理该事件包括从ObservableCollection中删除一个对象。如果该对象是选定对象之一,则DataGrid中高亮显示的行会发生奇怪的情况。我不知道该怎么解释,所以这里有一张图片 下面是重现问题的代码。在工具栏上添加了删除第三个选定项目的按钮,因此请确保在按下该按钮之前选择了5个以上的项目 视图模型C# 删除选定行后,DataGrid的SelectedItems和突出显示的行将不同步,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,我有DataGrid,其中ItemsSource绑定到ViewModel中的ObservableCollection。DataGrid允许选择多行。ViewModel订阅某个服务中的事件,处理该事件包括从ObservableCollection中删除一个对象。如果该对象是选定对象之一,则DataGrid中高亮显示的行会发生奇怪的情况。我不知道该怎么解释,所以这里有一张图片 下面是重现问题的代码。在工具栏上添加了删除第三个选定项目的按钮,因此请确保在按下该按钮之前选择了5个以上的项目 视图模型
public class MyViewModel
{
public ObservableCollection<MyObject> MyItems { get; set; }
public MyViewModel()
{
MyItems = new ObservableCollection<MyObject>();
for (int i = 0; i < 1000; i++)
{
MyItems.Add(new MyObject("name" + i, i));
}
}
}
模型简单类
public class MyObject
{
public string Name { get; set; }
public int Age { get; set; }
public MyObject(string name, int age)
{
Name = name;
Age = age;
}
}
删除后添加datagrid刷新和焦点
private void TestButton_Click(object sender, RoutedEventArgs e)
{
(DataContext as MyViewModel).MyItems.Remove(MyDataGrid.SelectedItems[2] as MyObject);
MyDataGrid.Items.Refresh();
MyDataGrid.Focus();
}
每当删除一个选定行时,将调用2个事件: 首先调用DataGrid.SelectedCellsChanged,在SelectedCellsChangedEventArgs.RemovedItems中,所有单元格都来自需要删除的行之后的行。这一行后不需要在选择中,但如果它是,那么它将丢失所选行样式,在我看来,它不符合预期
DataGrid.SelectionChanged被称为second,在SelectionChangedEventArgs.RemovedItems中,只包含将要删除的行。从您所说的内容来看,似乎数据网格删除了该项,并从具有相同id的列表中取消了该项的选择。我看不出您的代码中有任何问题。如果是DataGrid错误,我想您应该在视图模型上管理ObservableCollection SelectedItems。然后用你的重置DataGridconsistently@alessalessio,我在尝试绑定SelectedItems时遇到此错误-“SelectedItems”属性是只读的,无法从标记中设置。我无法执行此操作,因为从ObservableCollection处理程序中移除来自另一个服务的事件的方法位于ViewModel中;当某个项位于DataGrid.SelectedItems中时发生错误
public class MyObject
{
public string Name { get; set; }
public int Age { get; set; }
public MyObject(string name, int age)
{
Name = name;
Age = age;
}
}
private void TestButton_Click(object sender, RoutedEventArgs e)
{
(DataContext as MyViewModel).MyItems.Remove(MyDataGrid.SelectedItems[2] as MyObject);
MyDataGrid.Items.Refresh();
MyDataGrid.Focus();
}