当所选单元格位于该行时,设置WPF DataGrid行标题的样式?

时间:2013-09-12 10:17:06

标签: wpf xaml wpfdatagrid

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

SelectionMode="Single"
SelectionUnit="Cell"

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

这是XAML样式,它将background属性绑定到多值转换器。转换器绑定到标题DataGridRow SelectedCells的{​​{1}}属性: -

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

最初渲染DataGrid时(当没有选择时),似乎只调用该方法。选择一个单元格后,它不会被调用,所以我错过了什么?

2 个答案:

答案 0 :(得分:3)

您可以按如下方式更新样式并编写EqualityConverter,它将是一个MultiValueConverter,用于绑定CurrentCell中DataGrid的DataTrigger和RowHeader上下文。因此,每当您选择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;

经过测试......运作良好

答案 1 :(得分:0)

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>