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 最初呈现时(没有选择时)才会被调用。选择单元格后它不会被调用,那么我错过了什么?
您可以按以下步骤更新你的风格,写这将是一个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)
测试了一下..效果很好