我有一个WPF DataGrid,它配置为仅允许单个单元格选择,即:-
SelectionMode="Single"
SelectionUnit="Cell"
我想做的是更改包含当前所选单元格的任何行的row header的背景。到目前为止,我已经提出了以下建议,但是没有用。
这里是XAML样式,它将背景属性绑定到多值转换器。转换器绑定到标头的DataGridRow
and 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
方法看起来像这样(为了保持简洁,我删除了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时(没有选择时)才被调用。选择一个单元格后它没有被调用,那么我想念的是什么?
您可以按照以下方式更新样式,并编写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;
测试过..效果很好
Nitin的解决方案效果很好,但是在更新我的数据网格中的数据时,出现此警告: