You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF DataGrid新增行后焦点始终在末位,如何设置至首个单元格?

问题分析与解决方案

嘿,我来帮你搞定这个DataGrid焦点的问题!

问题根源

你遇到的情况很常见:当在最后一列按回车新增行后,DataGrid的默认行为只会完成行的添加,但不会自动把焦点转移到新行的第一个单元格——因为原来的回车事件逻辑只处理了行的创建,没有手动干预焦点的定位,而且默认的键盘事件还会让焦点停留在触发回车的那个单元格上。

修正方案

我们需要在新增行的逻辑后面,手动将焦点定位到新行的首个单元格,并且阻止默认的回车行为避免冲突。这里给你一个具体的实现示例:

1. 给DataGrid绑定预览键盘事件

在你的XAML里给DataGrid添加PreviewKeyDown事件:

<DataGrid x:Name="YourDataGrid" 
          PreviewKeyDown="YourDataGrid_PreviewKeyDown"
          AutoGenerateColumns="False"
          ItemsSource="{Binding YourItemsCollection}">
    <!-- 你的6列定义 -->
</DataGrid>

2. 后台实现事件处理逻辑

在代码后台编写事件处理方法,完成新增行+焦点定位:

private void YourDataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
    var dataGrid = sender as DataGrid;
    if (dataGrid == null) return;

    // 确认当前是最后一列且按下的是回车键
    var currentColumnIndex = dataGrid.CurrentCell.Column.DisplayIndex;
    if (currentColumnIndex == dataGrid.Columns.Count - 1 && e.Key == Key.Enter)
    {
        // 1. 新增数据行(替换成你实际的实体类和数据源)
        var newDataItem = new YourDataEntity(); // 你的数据模型
        ((ObservableCollection<YourDataEntity>)dataGrid.ItemsSource).Add(newDataItem);

        // 2. 延迟执行焦点定位,确保DataGrid已经渲染出新行
        Dispatcher.BeginInvoke(new Action(() =>
        {
            // 选中新行并滚动到可视区域
            dataGrid.SelectedItem = newDataItem;
            dataGrid.ScrollIntoView(newDataItem);
            
            // 设置当前单元格为新行的第一列
            var firstColumn = dataGrid.Columns[0];
            dataGrid.CurrentCell = new DataGridCellInfo(newDataItem, firstColumn);
            
            // 进入编辑模式(可选,根据你的需求决定是否需要自动编辑)
            dataGrid.BeginEdit();
        }), System.Windows.Threading.DispatcherPriority.Render);

        // 阻止默认回车行为,避免焦点停留在原单元格
        e.Handled = true;
    }
}

关键说明

  • 使用Dispatcher.BeginInvoke并指定Render优先级:这是为了确保DataGrid已经完成新行的UI渲染,否则可能找不到新行的单元格。
  • 手动设置CurrentCell并调用BeginEdit:这一步是直接把焦点切到新行的第一个单元格,并且如果需要的话自动进入编辑状态。
  • 标记e.Handled = true:阻止DataGrid默认的回车逻辑(比如移动到下一个单元格),避免和我们自定义的焦点逻辑冲突。

这样修改后,你在最后一列按回车新增行时,焦点就会自动跳到新行的第一个单元格啦!

内容的提问来源于stack exchange,提问作者Jitendra Jadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:21:25