当所选单元格位于WPF DataGrid行标题中时,是否设置该行标题的样式?
我有一个WPF数据网格,配置为只允许单个单元格选择,即:-当所选单元格位于WPF DataGrid行标题中时,是否设置该行标题的样式?,wpf,xaml,wpfdatagrid,Wpf,Xaml,Wpfdatagrid,我有一个WPF数据网格,配置为只允许单个单元格选择,即:- SelectionMode="Single" SelectionUnit="Cell" 我要做的是更改包含当前选定单元格的任何行的行标题的背景。到目前为止,我已经想出了以下方法,但它不起作用 下面是XAML样式,它将后台属性绑定到多值转换器。转换器绑定到标题的DataGridRow和DataGrid的SelectedCells属性:- <Style TargetType="{x:Type DataGridRowHeader}"&
SelectionMode="Single"
SelectionUnit="Cell"
我要做的是更改包含当前选定单元格的任何行的行标题的背景。到目前为止,我已经想出了以下方法,但它不起作用
下面是XAML样式,它将后台属性绑定到多值转换器。转换器绑定到标题的DataGridRow
和DataGrid
的SelectedCells
属性:-
<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>
该方法似乎仅在最初呈现DataGrid时(没有选择时)才被调用。选择单元格后不会调用它,那么我缺少什么呢?您可以按如下方式更新样式,并编写EqualityConverter,它将是一个多值转换器,用于绑定数据网格的
CurrentCell
和DataTrigger
中的行标题上下文。因此,每当您选择数据网格上的单元格时,就会触发此触发器
<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>
对它进行了测试。。工作正常您可以按如下方式更新样式,并编写EqualityConverter,它将是一个多值转换器,用于绑定数据网格的
CurrentCell
和DataTrigger
中的行标题上下文。因此,每当您选择数据网格上的单元格时,就会触发此触发器
<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>
对它进行了测试。。工作正常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>
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>
谢谢您的帮助。我被“选定的…”属性挂断了,完全错过了“CurrentCell”!很好的解决方案,但是当SelectionMode不是Single时,您有什么想法如何做到这一点吗?在这种情况下,绑定到CurrentCell没有意义:(谢谢。我太关注“Selected…”属性了,完全错过了“CurrentCell”!这是一个很好的解决方案,但是当SelectionMode不是单一模式时,您知道如何做吗?在这种情况下,绑定到CurrentCell没有意义:(这适用于全行选择或用户通过行标题选择。不幸的是,如果选择单位是单元格,IsRowSelected将不为真。为此,接受的答案应该有效。无论如何,投票支持两个答案。这适用于全行选择或用户通过行标题选择。不幸的是,如果选择单位是单元格,IsRowSelected将不为true。因此,接受的答案应该有效。无论如何,对两个答案都进行投票。