WPF DataGrid - SelectedItem 在文本外的 FullRow 选择上没有改变

WPF DataGrid - SelectedItem not changing on FullRow selection outside text

我正在构建一个包含高度为 40 的行的数据网格。在行选择上,程序打开一个新选项卡,其中包含特定于该项目的用户控件。

当我单击单元格内容 (Red boxes in this image) 之外的行中的任意位置时,事件会触发,但 'CurrentItem' 不会更新。

基本上,只有单击单元格内容时才会选中该行。有没有其他人处理过这个问题,并对发生的事情有解决方案?

这是我的造型:

        <DataGrid Name="MachinesGrid" ItemsSource="{Binding MainData.Machines}">
        <DataGrid.Style>
            <Style TargetType="DataGrid">
                <Setter Property="SelectionMode" Value="Single" />
                <Setter Property="SelectionUnit" Value="FullRow" />
                <Setter Property="AutoGenerateColumns" Value="False" />
                <Setter Property="ColumnWidth" Value="Auto" />
                <Setter Property="CanUserAddRows" Value="False" />
                <Setter Property="Background" Value="{StaticResource BrushBackground}" />
                <Setter Property="RowBackground" Value="{StaticResource BrushGreyMid}" />
                <Setter Property="AlternatingRowBackground" Value="{StaticResource BrushGreyDark}" />
                <Setter Property="GridLinesVisibility" Value="None" />
                <Setter Property="ColumnHeaderStyle">
                    <Setter.Value>
                        <Style TargetType="DataGridColumnHeader">
                            <Setter Property="Background" Value="{StaticResource BrushBlue}" />
                            <Setter Property="Foreground" Value="{StaticResource BrushWhite}" />
                            <Setter Property="Height" Value="40" />
                            <Setter Property="FontWeight" Value="SemiBold" />
                        </Style>
                    </Setter.Value>
                </Setter>
                <Setter Property="CellStyle">
                    <Setter.Value>
                        <Style TargetType="DataGridCell">
                            <Setter Property="VerticalAlignment" Value="Center" />
                            <Setter Property="Foreground" Value="{StaticResource BrushWhite}" />
                            <Setter Property="Background" Value="Transparent" />
                            <Setter Property="BorderThickness" Value="0"/>
                            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
                        </Style>
                    </Setter.Value>
                </Setter>
                <Setter Property="RowStyle">
                    <Setter.Value>
                        <Style TargetType="DataGridRow">
                            <Setter Property="Height" Value="40" />
                            <EventSetter Event="MouseLeftButtonUp" Handler="EventSetter_OnHandler" />
                            <Style.Triggers>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter Property="Background" Value="{StaticResource BrushGreyLite}" />
                                </Trigger>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="Background" Value="{StaticResource BrushBlue}" />
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.Style>

据我所知,您的问题是选择最初是在 DataGridCell 中通过设置

触发的
<Setter Property="VerticalAlignment" Value="Center" />

你的意思是 DataGridCell 应该在 DataGridRow 中垂直居中,这导致一些 space 顶部和底部不属于 DataGridCell,因此不是触发任何选择。

要解决此问题,您必须将 VerticalAlignment 设置为 Stretch(默认),但您的内容不再居中,为此您必须覆盖 ControlTemplate DataGridCell:

<ControlTemplate TargetType="{x:Type DataGridCell}">
    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
        <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    </Border>
</ControlTemplate>

现在您可以在 DataGridCell 上设置 VerticalContentAlignmentHorizontalContentAlignment 来对齐您的内容。


您的 DataGridCell-样式应该如下所示

<Style TargetType="DataGridCell">
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="Foreground" Value="{StaticResource BrushWhite}" />
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                    <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>