在数据网格 C# WPF 中按下 Enter 获取当前选定的单元格

Get currently selected cell on Enter pressed in a datagrid C# WPF

我是 C# 新手。当我按下回车键并在其他地方使用该值时,我一直在尝试捕获我当前选择的数据网格单元格中的值。我目前正在使用此处理程序的 KeyUp 事件:

private void Cell_OnKeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        DataGrid dg = (DataGrid) sender;
        var u = e.OriginalSource as UIElement;
        e.Handled = true;
        u.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));   
        MyType mo = (MyType) dg.CurrentItem;
        DoSomething(mo);
    }
}

数据网格中 Enter 键的默认行为是退出编辑并向下移动到下面的单元格,除非位于数据网格的底部。

上面的处理程序工作正常,除了当我位于数据网格底部时。我最终获取了上面单元格的值...

我试过一些这样的技巧:

bool notEnd = u.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
if (notEnd)
{
    u.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));
}   
u.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));

但后来我 运行 遇到无法区分底部两个单元格的问题。

所以我想我有两个问题,我很乐意回答其中一个问题:

1.有没有办法确定您何时位于数据网格的底行?

2。有没有办法覆盖数据网格中按下回车键的默认行为?

如果有任何建议,我将不胜感激。谢谢。

2.: 可以,看 Override the enter key, but keep default behavior for other keys in a wpf datagrid

简短:派生自定义 NoEnterDataGrid class,并防止基础 class 在按下回车键时处理 OnKeyDown()。

1.: 使用 KeyDown 事件可能会有所帮助,因为它可能在单元格选择移动之前执行。如果您不想立即执行操作,请将当前单元格存储在 KeyDown 中,然后在 KeyUp 中执行您的操作——但请注意,如果用户在按住 Enter 键的同时单击数据网格,这可能会导致奇怪的行为。