C# 在运行时使用自动生成的列更改WPF datagrid中列标题的颜色

C# 在运行时使用自动生成的列更改WPF datagrid中列标题的颜色,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我在WPF项目窗口中有一个WPFDataGrid。我已经用数据表填充了网格,并自动生成了列(不幸的是这是必要的),并且需要根据某些其他因素更改列的标题颜色 我有一个需要突出显示的列名列表,可以很容易地根据这些列名计算出它们的索引(因为我自己在DataGrid中生成了它们) 然而,我似乎无法让列标题改变颜色,这必须在代码中完成,因为我不知道在设计时哪些列需要突出显示。我已经在页眉上有了一点模板。。。不确定这是否是“压倒”我正在尝试做的事情 网格: 这样不行。原因有很多 您正在DataGridCol

我在WPF项目窗口中有一个WPF
DataGrid
。我已经用
数据表
填充了网格,并自动生成了列(不幸的是这是必要的),并且需要根据某些其他因素更改列的标题颜色

我有一个需要突出显示的列名列表,可以很容易地根据这些列名计算出它们的索引(因为我自己在
DataGrid
中生成了它们)

然而,我似乎无法让列标题改变颜色,这必须在代码中完成,因为我不知道在设计时哪些列需要突出显示。我已经在页眉上有了一点模板。。。不确定这是否是“压倒”我正在尝试做的事情

网格:


这样不行。原因有很多

  • 您正在DataGridColumn.HeaderStringFormatProperty>>上放置笔刷,这将不起作用
  • 无论如何,这不会传输到列的标题
  • 要做到这一点,您需要了解默认情况下DataGridColumnHeader的dataContext未设置为相应的列。你必须手动设置它

    看看这篇文章:

    现在,就您而言,我会以与上述链接相同的方式做一些事情:

    在DataGridColumn的类中添加所需的依赖项属性:

    private static readonly DependencyProperty ColumnHeaderTextProperty = DependencyProperty.Register("ColumnHeader", typeof(string), typeof(MyDataGridColumn));
    public string ColumnHeaderText
    {
        get { return (string)(GetValue(ColumnHeaderTextProperty)); }
        set { SetValue(ColumnHeaderTextProperty, value); }
    }
    
    private static readonly DependencyProperty ColumnHeaderBackgroundProperty = DependencyProperty.Register("ColumnHeader", typeof(Brush), typeof(MyDataGridColumn));
    public Brush ColumnHeaderBackground
    {
        get { return (Brush)(GetValue(ColumnHeaderBackgroundProperty )); }
        set { SetValue(ColumnHeaderBackgroundProperty , value); }
    }
    
    然后在列的构造函数中设置dataContext,如下所示:

    public MyDataGridColumn()
    {
        Header = this;
        ColumnHeaderText = "My header text";
    }
    
    myColumn.Header = myColumn;
    myColumn.SetValue(columnHelper.ColumnHeaderTextProperty, "my Header Text");
    myColumn.SetValue(columnHelper.ColumnHeaderBackgroundProperty, Brushes.Red);
    
    (而不是您以前使用的
    Header=“我的页眉文本”

    最后,更新标题模板:

    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <TextBlock Text="{Binding ColumnHeaderText}" Foreground="Blue" Background="{Binding ColumnHeaderBackground}">
                            <TextBlock.LayoutTransform>
                                <RotateTransform Angle="-90" />
                            </TextBlock.LayoutTransform>
                        </TextBlock>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.ColumnHeaderStyle>
    
    编辑:如果您的列没有特殊的类,您应该可以使用附加的属性来执行此操作,并且您可以将我编写的代码放在构造函数中的其他地方,如下所示:

    public MyDataGridColumn()
    {
        Header = this;
        ColumnHeaderText = "My header text";
    }
    
    myColumn.Header = myColumn;
    myColumn.SetValue(columnHelper.ColumnHeaderTextProperty, "my Header Text");
    myColumn.SetValue(columnHelper.ColumnHeaderBackgroundProperty, Brushes.Red);
    

    编辑hashlock^

    为什么您的样式将
    HeaderStringFormat
    设置为
    Colors.Red
    ?我只是想突出显示文本,这是可以接受的,但我宁愿突出显示整个“header”单元格。这不起作用,但它仍然运行,没有出现任何WPF异常。我只是好奇,因为
    HeaderStringFormat
    通常类似于
    “M/d/yy”
    “,#0.00”
    ,而不是一种颜色。哈哈。。。显然,我在那里失败得很惨。是的,你是对的,我在玩HeaderCellStyle或类似的游戏,看到了这个,就换了房子,以防它起作用。:-D好的,就因为你在这个星期一早上让我笑了^^
    ((MyDataGridColumn)(this.dgSkillsMatrix.Columns[4])).ColumnHeaderBackground = Brushes.Red;
    
    myColumn.Header = myColumn;
    myColumn.SetValue(columnHelper.ColumnHeaderTextProperty, "my Header Text");
    myColumn.SetValue(columnHelper.ColumnHeaderBackgroundProperty, Brushes.Red);