当所选单元格驻留在该行中时,为 WPF DataGrid 行标题设置样式?

And*_*ens 0 wpf xaml wpfdatagrid

我有一个 WPF DataGrid 配置为只允许选择单个单元格,即:-

SelectionMode="Single"
SelectionUnit="Cell"
Run Code Online (Sandbox Code Playgroud)

我想要做的是更改包含当前选定单元格的任何行的行标题的背景。到目前为止,我想出了以下内容,但它不起作用。

这是 XAML 样式,它将背景属性绑定到多值转换器。转换器绑定到标头DataGridRow 以下SelectedCells属性DataGrid:-

<Style TargetType="{x:Type DataGridRowHeader}">
    <Setter Property="Background">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource dataGridHeaderBackgroundConverter}" Mode="OneWay">
                <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}" />
                <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}" 
                         Path="SelectedCells"
                         Mode="OneWay"/>
            </MultiBinding>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

多转换器的Convert方法看起来像这样(我已经删除了空检查代码以保持简洁):-

var row = values[0] as DataGridRow;
var selectedCells = values[1] as IList<DataGridCellInfo>;
var selectedCell = selectedCells[0];

return selectedCell.Item == row.Item ? Colors.Red : Colors.LightGray;
Run Code Online (Sandbox Code Playgroud)

该方法似乎只在 DataGrid 最初呈现时(没有选择时)才会被调用。选择单元格后它不会被调用,那么我错过了什么?

Nit*_*tin 5

您可以按以下步骤更新你的风格,写这将是一个MultiValueConverter的EqualityConverter被用来绑定DataGrid的CurrentCell和的rowHeader上下文中DataTrigger。因此,每次您选择DataGrid.

  <Style TargetType="{x:Type DataGridRowHeader}">
            <Style.Triggers>
                <DataTrigger  Value="true">
                    <DataTrigger.Binding>
                        <MultiBinding Converter="{StaticResource EqualityConverter}">
                            <Binding/>
                            <Binding Path="CurrentCell" RelativeSource="{RelativeSource AncestorType={x:Type DataGrid}}"/>
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter Property="Background" Value="Black"/>
                </DataTrigger>
            </Style.Triggers>

        </Style>
Run Code Online (Sandbox Code Playgroud)

并在转换器的Convert方法中:

            if(values[0] == ((DataGridCellInfo)values[1]).Item)
            {
                return true;
            }
            return false;
Run Code Online (Sandbox Code Playgroud)

测试了一下..效果很好