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

问题描述 投票:0回答:2

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

SelectionMode="Single"
SelectionUnit="Cell"

我想做的是更改包含当前所选单元格的任何行的row header的背景。到目前为止,我已经提出了以下建议,但是没有用。

这里是XAML样式,它将背景属性绑定到多值转换器。转换器绑定到标头的DataGridRow and SelectedCellsDataGrid属性:-

<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方法看起来像这样(为了保持简洁,我删除了null检查代码:-

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时(没有选择时)才被调用。选择一个单元格后它没有被调用,那么我想念的是什么?

wpf xaml wpfdatagrid
2个回答
3
投票

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

以及转换器的Convert方法:

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

测试过..效果很好


-1
投票

Nitin的解决方案效果很好,但是在更新我的数据网格中的数据时,出现此警告:

© www.soinside.com 2019 - 2024. All rights reserved.