我正在使用键盘删除WPF DataGrid行"删除"按键。 但是,删除行后,DataGrid会失去焦点,而DataGrid.SelectedIndex = -1。
与WinForm数据网格相比,删除一行后,焦点会自动切换到下一个可聚焦行,这更合理。
" next focusable ",我的意思是,例如:
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数据网格中实现相同的效果?
顺便说一下,以下是一个关注删除后第一行的例子,这是不理想的,因为我们希望它是"下一个可聚焦的行"。
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;
}
}
}
有什么想法吗?
感谢。
答案 0 :(得分:0)
您将DataGrid绑定到什么?你试过CollectionView(MSDN)吗?它有类似CurrentPosition和MoveCurrentToNext()方法的道具。您可以获取要删除的行的当前位置,然后根据CollectionView的排序顺序找到下一个。
<强>更新强> 如果您正在进行MVVM,请禁用DataGrid的删除(see this answer)并让您的VM从集合中删除该项目。您将知道正在删除哪个项目,因此您应该能够确定下一个(或之前的)项目是什么。让您的VM公开一个SelectedItem属性,您将该属性绑定到DataGrid.SelectedItem。在VM上设置SelectedItem,应在DataGrid中选择该行。
听起来WinForms Datagrid处理了很多这样的开箱即用,所以你可能觉得你正在重新发明轮子,这对于那些在#34中自动运行的东西来说是很多工作;旧&#34; UX技术。