C# 删除选定行后,DataGrid的SelectedItems和突出显示的行将不同步

C# 删除选定行后,DataGrid的SelectedItems和突出显示的行将不同步,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,我有DataGrid,其中ItemsSource绑定到ViewModel中的ObservableCollection。DataGrid允许选择多行。ViewModel订阅某个服务中的事件,处理该事件包括从ObservableCollection中删除一个对象。如果该对象是选定对象之一,则DataGrid中高亮显示的行会发生奇怪的情况。我不知道该怎么解释,所以这里有一张图片 下面是重现问题的代码。在工具栏上添加了删除第三个选定项目的按钮,因此请确保在按下该按钮之前选择了5个以上的项目 视图模型

我有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();
    }