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

WPF中DataGrid行双击事件无效,如何实现双击显示单元格内容?

解决WPF DataGrid行双击事件不触发的问题

看起来你的DataGrid行双击事件没触发,大概率是事件路由被单元格控件拦截了——毕竟DataGrid的单元格(比如你用的DataGridTextColumn)会优先处理鼠标事件,导致事件没法冒泡到DataGridRow层级。下面给你几个可行的解决方案:

方案一:直接给DataGrid绑定MouseDoubleClick事件

这个方法更简单可靠,不需要依赖RowStyle的EventSetter,直接在DataGrid上绑定事件,然后在处理方法里获取选中的行数据:

修改你的XAML:

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="14,55,0,46" 
          Name="dataGridCustomers" Width="575" 
          ItemsSource="{Binding Path=LoadDataBinding}" 
          CanUserResizeRows="False"
          MouseDoubleClick="dataGridCustomers_MouseDoubleClick"> <!-- 直接绑定到DataGrid -->
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=DEPARTMENT_ID}" Header="DepartmentID" Width="100" IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=DEPARTMENT_NAME}" Header="Department name" Width="100" IsReadOnly="True" />
        <DataGridTextColumn Binding="{Binding Path=LOCATION}" Header="Location" Width="150" IsReadOnly="True" />
    </DataGrid.Columns>
</DataGrid>

然后在后台代码里实现事件处理逻辑(记得替换YourDepartmentClass为你实际的实体类):

private void dataGridCustomers_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    var targetGrid = sender as DataGrid;
    if (targetGrid == null || targetGrid.SelectedItem == null)
        return;

    // 获取双击行对应的实体数据
    var selectedDept = targetGrid.SelectedItem as YourDepartmentClass;
    if (selectedDept != null)
    {
        // 这里替换成你显示内容的逻辑,比如弹出窗口或更新界面控件
        MessageBox.Show($"部门ID:{selectedDept.DEPARTMENT_ID}\n部门名称:{selectedDept.DEPARTMENT_NAME}\n位置:{selectedDept.LOCATION}");
    }
}

方案二:改用PreviewMouseDoubleClick事件(隧道式事件)

如果坚持要给DataGridRow绑定事件,可以改用PreviewMouseDoubleClick——它是隧道式事件,会先从父控件往下传递,不会被单元格轻易拦截:

修改RowStyle部分的XAML:

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <EventSetter Event="PreviewMouseDoubleClick" Handler="dataGridCustomers_RowDoubleClick"/>
    </Style>
</DataGrid.RowStyle>

后台对应的处理方法:

private void dataGridCustomers_RowDoubleClick(object sender, MouseButtonEventArgs e)
{
    var targetRow = sender as DataGridRow;
    if (targetRow == null || targetRow.DataContext == null)
        return;

    var selectedDept = targetRow.DataContext as YourDepartmentClass;
    if (selectedDept != null)
    {
        // 显示内容逻辑
        MessageBox.Show($"部门ID:{selectedDept.DEPARTMENT_ID}\n部门名称:{selectedDept.DEPARTMENT_NAME}\n位置:{selectedDept.LOCATION}");
    }

    // 标记事件已处理,避免继续传递到DataGrid层级
    e.Handled = true;
}

额外检查点

最后确认几个可能的坑:

  • 后台事件方法的签名必须完全匹配:void 方法名(object sender, MouseButtonEventArgs e),有没有写错方法名或者参数类型?
  • 你的DataGrid已经正确绑定了ItemsSource,界面上能看到行数据吗?如果没有行,双击当然不会触发事件
  • 有没有其他控件(比如透明遮罩、弹出层)覆盖在DataGrid上,导致点击不到行?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:26:04