根据数据网格中的选择改变ColumnHeaderStyle的背景颜色

本文关键字:选择 改变 背景 颜色 ColumnHeaderStyle 数据 数据网 网格 | 更新日期: 2023-09-27 18:08:34

我想出了如何突出显示感兴趣的行。我可以获得我感兴趣的列的索引,并使用ScrollIntoView以便跳转到它。但是,它不会立即显示给用户。我想突出显示列,或者更改ColumnHeaderStyle。我似乎不知道如何在xaml或代码背后做到这一点。

另一种选择是不突出显示整个行和列标题,而只突出显示感兴趣的单元格。我很想那样做,但是想不明白。

我当前的DataGrid是这样的:

<DataGrid x:Name="dtGridReads"  AutoGenerateColumns="False" 
            VirtualizingStackPanel.IsVirtualizing="True"                                       
            VirtualizingStackPanel.VirtualizationMode ="Standard" 
              EnableColumnVirtualization="True"
              EnableRowVirtualization="True"
            ScrollViewer.IsDeferredScrollingEnabled="True"
            CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="True"
             ItemsSource ="{Binding}" Block.TextAlignment="Center"
             AlternatingRowBackground="#F1F1F1" RowBackground="White"
              CanUserAddRows="False" CanUserDeleteRows="False" FrozenColumnCount="1"
               GridLinesVisibility="None"                   ScrollViewer.ScrollChanged="dtGridReads_ScrollChanged">
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <Trigger Property="DataGridCell.IsSelected" Value="True">
                    <Setter Property="Background" Value="red" />
                    <Setter Property="BorderThickness" Value="0" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>

我的代码:

    public void ShowSelectedCell(int row, int column)
    {
        //dtGridReads.SelectedItem = dtGridReads.Items[row];
        //dtGridReads.SelectedItem = dtGridReads.Columns[column];
        //dtGridReads.CurrentColumn = dtGridReads.Columns[column];
        dtGridReads.ScrollIntoView(dtGridReads.Items[row], dtGridReads.Columns[column]);
    }

谢谢。

根据数据网格中的选择改变ColumnHeaderStyle的背景颜色

假设您需要根据选定的'高亮单元格突出显示data gid列标题....

DataGridColumnHeader创建DataGrid作用域的Style。在样式中包含一个数据触发器,检查列标题的内容和当前单元格的列标题的内容是否相等…这意味着列标头属于当前单元格所属的列。如果是,我们改变标题的背景颜色。

<toolkit:DataGrid x:Name="MyDataGrid"
      IsReadOnly="True"
      AutoGenerateColumns="False">
  <toolkit:DataGrid.Resources>
    <local:EqualityConverter x:Key="EqualityConverter"/>
    <Style TargetType="{x:Type toolkit:DataGridColumnHeader}">
      <Style.Triggers>
        <DataTrigger Value="True">
          <DataTrigger.Binding>
            <MultiBinding Converter="{StaticResource EqualityConverter}">
               <Binding Path="CurrentCell.Column.Header"
                  RelativeSource="{RelativeSource
                     AncestorType={x:Type toolkit:DataGrid}}"/>
                <Binding Path="Content"
                  RelativeSource="{RelativeSource Self}"/>
            </MultiBinding>
          </DataTrigger.Binding>
          <Setter Property="Background" Value="Red"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </toolkit:DataGrid.Resources>
  <toolkit:DataGrid.Columns>
    <toolkit:DataGridTextColumn Header="Key"
           Binding="{Binding Key, Mode=OneWay}"></toolkit:DataGridTextColumn>
    <toolkit:DataGridTextColumn Header="Value"
           Binding="{Binding Value, Mode=OneWay}"></toolkit:DataGridTextColumn>
  </toolkit:DataGrid.Columns>
</toolkit:DataGrid>

EqualityConverter只是一个多绑定转换器,检查绑定值是否相等…

public class EqualityConverter : IMultiValueConverter
{
    public object Convert(
            object[] values,
            Type targetType,
            object parameter,
            System.Globalization.CultureInfo culture)
    {
        if (values != null)
        {
            for (var i = 1; i < values.Count(); i++)
            {
                if (values[i] == null || !values[i].Equals(values[i-1]))
                {
                    return false;
                }
            }
            return true;
        }
        return false;
    }
    public object[] ConvertBack(
             object value,
             Type[] targetTypes,
             object parameter,
             System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

如果有帮助请告诉我。