C# 行删除后WPF DataGrid失去焦点

C# 行删除后WPF DataGrid失去焦点,c#,wpf,datagrid,C#,Wpf,Datagrid,我正在使用WPF DataGrid通过键盘“Delete”键删除行。 但是,删除该行后,DataGrid失去了焦点,DataGrid.SelectedIndex=-1 与WinForm datagrid相比,删除一行后,焦点会自动转移到下一个可聚焦行,这更合理 通过“下一个可聚焦”,我的意思是,例如: Row A Row B Row C If we delete Row A, the next focusable will be Row B. If we delete Row B, the n

我正在使用WPF DataGrid通过键盘“Delete”键删除行。 但是,删除该行后,DataGrid失去了焦点,DataGrid.SelectedIndex=-1

与WinForm datagrid相比,删除一行后,焦点会自动转移到下一个可聚焦行,这更合理

通过“下一个可聚焦”,我的意思是,例如:

Row A
Row B
Row C

If we delete Row A, the next focusable will be Row B.
If we delete Row B, the next focusable will be Row C.
If we delete Row C, the next focusable will be Row B (the last row).
我们如何在WPF datagrid中实现同样的效果?

顺便说一句,下面是一个示例,重点是删除后的第一行,这并不理想,因为我们希望它是“下一个可聚焦行”

有什么想法吗


谢谢。

您将DataGrid绑定到什么?您尝试过CollectionView()吗?具有诸如CurrentPosition和MoveCurrentToNext()方法之类的道具。您可以获取要删除的行的当前位置,然后根据CollectionView的排序顺序找到下一个位置

更新: 如果您正在执行MVVM,请禁用DataGrid的delete(),并让您的VM从集合中删除该项。您将知道要删除的项目,这样您就可以知道下一个(或上一个)项目是什么。让您的VM公开一个SelectedItem属性,您将该属性绑定到DataGrid.SelectedItem。在虚拟机上设置SelectedItem,并且应在DataGrid中选择该行


听起来WinForms Datagrid在开箱即用的情况下处理了很多这方面的问题,因此您可能会觉得自己在重新发明轮子,而且这是一项在“旧”UX技术中自动工作的工作。

Datagrid
不会失去焦点,删除的行(项)会。要实现行为(这不是默认设置),您必须做一些工作,例如:禁用删除、手动处理按键、处理
Delete
key以删除行并应用所需的行为。如何填充
DataGrid
?是通过绑定它的ItemsSource实现的吗?@Sinatr我无法手动处理,出于某种原因,我对delete进行了键绑定。@Tomtom,是的,ItemsSource确实绑定了ViewModel中定义的数据,DataGrid是可编辑的。然后,
DataGrid
会自动将焦点设置到下一行“获取被删除行的当前位置”,是的,我正在尝试,但是有没有一种简单的方法可以传递它呢?我正在将它绑定到一个IObservableCollection。Collection视图()有助于导航数据集合。ObservableCollection在集合更改时为您提供通知,这对导航没有帮助。我会用更多的信息更新我的答案。该行将被选中,但不会被聚焦。这是两种截然不同的DataGridRow状态。
    private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.RemovedItems.Count > 0)
        {
            DataGrid grid = sender as DataGrid;
            if (grid.SelectedIndex == -1)
            {
                grid.SelectedCells.Clear();
                grid.SelectedIndex = 0;
            }
        }
    }