Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当所选单元格位于WPF DataGrid行标题中时,是否设置该行标题的样式?_Wpf_Xaml_Wpfdatagrid - Fatal编程技术网

当所选单元格位于WPF DataGrid行标题中时,是否设置该行标题的样式?

当所选单元格位于WPF DataGrid行标题中时,是否设置该行标题的样式?,wpf,xaml,wpfdatagrid,Wpf,Xaml,Wpfdatagrid,我有一个WPF数据网格,配置为只允许单个单元格选择,即:- SelectionMode="Single" SelectionUnit="Cell" 我要做的是更改包含当前选定单元格的任何行的行标题的背景。到目前为止,我已经想出了以下方法,但它不起作用 下面是XAML样式,它将后台属性绑定到多值转换器。转换器绑定到标题的DataGridRow和DataGrid的SelectedCells属性:- <Style TargetType="{x:Type DataGridRowHeader}"&

我有一个WPF数据网格,配置为只允许单个单元格选择,即:-

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。因此,接受的答案应该有效。无论如何,对两个答案都进行投票。