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

WPF DataGrid自定义行Border空白区域点击时SelectionChanged事件未触发

解决WPF DataGrid自定义行样式点击空白区域不触发SelectionChanged的问题

问题原因

你自定义的DataGridRow模板中,外层Border的空白区域(列内容未覆盖的部分)未关联行的选择逻辑,点击这些区域时,鼠标事件无法触发DataGridRow的选中状态变更,因此不会触发SelectionChanged事件。只有点击单元格内的文本(ContentPresenter承载的内容)时,事件才会传递到行层级触发选择。

解决方案

方法一:通过PreviewMouseLeftButtonDown事件手动选中行

修改自定义行模板中的Border,添加鼠标预览点击事件,在事件处理中手动将当前行设为选中状态:

  1. 修改XAML中CustomDataGridRowStyle里的Border:
<Border BorderBrush="{TemplateBinding BorderBrush}"
        Background="LightGray"
        BorderThickness="{TemplateBinding BorderThickness}"
        CornerRadius="20"
        Margin="0,5,0,5"
        PreviewMouseLeftButtonDown="RowBorder_PreviewMouseLeftButtonDown">
  1. 在DataGridSamplePage.xaml.cs中添加事件处理方法:
private void RowBorder_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (sender is Border border)
    {
        var targetRow = border.TemplatedParent as DataGridRow;
        if (targetRow != null && !targetRow.IsSelected)
        {
            targetRow.IsSelected = true;
            e.Handled = true;
        }
    }
}

方法二:纯XAML实现(无需后台代码)

若不想编写后台代码,可使用EventTrigger结合属性变更实现,需先通过NuGet安装Microsoft.Xaml.Behaviors.Wpf包:

  1. 在XAML页面顶部添加命名空间:
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
  1. 修改自定义行模板的Border:
<Border BorderBrush="{TemplateBinding BorderBrush}"
        Background="LightGray"
        BorderThickness="{TemplateBinding BorderThickness}"
        CornerRadius="20"
        Margin="0,5,0,5">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="PreviewMouseLeftButtonDown">
            <i:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource TemplatedParent}}"
                                    PropertyName="IsSelected"
                                    Value="True"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <!-- 原有SelectiveScrollingGrid内容保持不变 -->
</Border>

额外优化:单元格空白区域触发选择

若希望点击单元格内文本周围的空白区域也能触发选择,需修改DataGridCell模板,给内部Border设置Background="Transparent"(默认空背景不会捕获鼠标事件):

<ControlTemplate TargetType="{x:Type DataGridCell}">
    <Border BorderThickness="0"
            Padding="5"
            Background="Transparent">
        <ContentPresenter />
    </Border>
</ControlTemplate>

效果验证

修改完成后,点击行Border范围内的任意区域(包括空白区域、单元格空白、文本),都会触发DataGrid的SelectionChanged事件,控制台将输出MyDataGrid_OnSelectionChanged fired。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:35:53