我有一个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时(当没有选择时),似乎只调用该方法。选择一个单元格后,它不会被调用,所以我错过了什么?
答案 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>