0

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

SelectionMode="Single"
SelectionUnit="Cell"

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

这是 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>

多转换器的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;

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

4

2 回答 2

5

您可以按如下方式更新您的样式并编写 EqualityConverter,这将是一个 MultiValueConverter,用于将 DataGridCurrentCell和 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>

并在转换器的Convert方法中:

            if(values[0] == ((DataGridCellInfo)values[1]).Item)
            {
                return true;
            }
            return false;

测试了一下。。效果很好

于 2013-09-12T10:53:37.590 回答
1

Nitin 的解决方案完美运行,但在我的数据网格中更新数据时,会出现此警告:

System.Windows.Data Warning: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=CurrentCell; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'NoTarget' (type 'Object')

有什么办法可以消除这个警告吗?

无论如何,这是另一种工作方法......

<DataGrid.RowHeaderStyle>
    <Style TargetType="DataGridRowHeader">
        <Setter Property="Background" Value="black" />
        <Style.Triggers>
            <Trigger Property="IsRowSelected" Value="True">
                <Setter Property="Background" Value="white" />
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowHeaderStyle>
于 2020-02-25T16:22:07.277 回答