我正在通过键盘“删除”键使用 WPF DataGrid 行删除。但是,行删除后,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).
Run Code Online (Sandbox Code Playgroud)
我们如何在 WPF 数据网格中实现相同的效果?
顺便说一下,下面是一个关注删除后第一行的例子,这并不理想,因为我们希望它是“下一个可聚焦的行”。
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
谢谢。
您将 DataGrid 绑定到什么?您尝试过 CollectionView ( MSDN ) 吗?它有像 CurrentPosition 和 MoveCurrentToNext() 方法这样的属性。您可以获取要删除的行的当前位置,然后根据 CollectionView 的排序顺序找到下一行。
更新: 如果您正在执行 MVVM,请禁用 DataGrid 的删除(请参阅此答案)并让您的 VM 从集合中删除该项目。您将知道哪个项目被删除,因此您应该能够弄清楚下一个(或上一个)项目是什么。让您的 VM 公开一个 SelectedItem 属性,您将将该属性绑定到 DataGrid.SelectedItem。在 VM 上设置 SelectedItem,并且应在 DataGrid 中选择该行。
听起来 WinForms Datagrid 处理了很多开箱即用的事情,因此您可能会觉得自己正在重新发明轮子,并且对于在“旧”UX 技术中自动工作的东西来说,这是一项大量的工作。