如何始终显示所选行的蓝色,无论它是否具有焦点?

How to show always the blue color of a selected row, no matter if it has the focus or not?

我试图始终显示 DataGrid 行的蓝色,无论它是否具有焦点。我正在尝试这段代码:

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=IsSelected}" Value="true"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="Background" Value="{x:Static SystemColors.HighlightBrushKey}" />
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowStyle>

但我得到的错误是 SystemResourcesKey 无效,只能使用 BindingBase 元素。

选中行时如何设置行的默认蓝色?

修复 SystemResourceKey 的错误:

<Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}" />

您当前的方法不起作用的原因有以下几个:

  • 你指的是属性的Key,不是刷HighlightBrush
  • 您必须使用 RelativeSource
  • IsSelected 属性 绑定到 DataGridRow 本身
  • 行背景被每个有自己背景的单元格遮挡

为了让它工作,用画笔替换键,调整绑定到 IsSelected 并添加一个单元格样式,将单个单元格的背景设置为所需的背景。或者,您可以将单元格背景设置为 Transparent,这样行背景就不会被遮挡。

请注意,我还添加了 setter 来调整 ForegroundBorderBrush,使其看起来与选中状态相同。但是,我建议您 不要 使用 BorderBrush,因为边框颜色也用于验证和其他视觉状态。

<DataGrid.CellStyle>
   <Style TargetType="{x:Type DataGridCell}">
      <Style.Triggers>
         <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
               <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" Value="True" />
            </MultiDataTrigger.Conditions>
            <MultiDataTrigger.Setters>
               <Setter Property="Background" Value="{x:Static SystemColors.HighlightBrush}" />
               <Setter Property="Foreground" Value="{x:Static SystemColors.HighlightTextBrush}" />
               <Setter Property="BorderBrush" Value="{x:Static SystemColors.HighlightBrush}"/>
            </MultiDataTrigger.Setters>
         </MultiDataTrigger>
      </Style.Triggers>
   </Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
   <Style TargetType="{x:Type DataGridRow}">
      <Style.Triggers>
         <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
               <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="true" />
            </MultiDataTrigger.Conditions>
            <MultiDataTrigger.Setters>
               <Setter Property="Background" Value="{x:Static SystemColors.HighlightBrush}" />
            </MultiDataTrigger.Setters>
         </MultiDataTrigger>
      </Style.Triggers>
   </Style>
</DataGrid.RowStyle>

如果您不关心不属于任何列的单元格的背景(占据右侧剩余的 space),则根本不需要行样式。