Изменение цвета заголовка столбца в таблице данных WPF с автоматически созданными столбцами во время выполнения - PullRequest
1 голос
/ 15 декабря 2011

У меня есть WPF DataGrid в окне проекта WPF. Я заполнил сетку DataTable и автоматически сгенерировал столбцы (к сожалению, это необходимо), и у меня есть требование изменить цвет заголовков столбцов в зависимости от некоторых других факторов.

У меня есть список имен столбцов, которые необходимо выделить, и я легко смогу определить их индексы на основе этого (поскольку я сам сгенерировал их в DataGrid).

Однако я не могу заставить заголовок столбца изменить цвет, это нужно сделать в коде, так как я не знаю во время разработки, какие столбцы нужно будет подсвечивать. У меня уже есть немного шаблона в заголовке ... не уверен, что это "переопределение" того, что я пытаюсь сделать.

Сетка:

<DataGrid FrozenColumnCount="1"  AutoGenerateColumns="True" Grid.Row="1"
    AlternationCount="2" HeadersVisibility="Column" Name="dgSkillsMatrix"
    Margin="0,0,2,1" HorizontalGridLinesBrush="White" VerticalGridLinesBrush="White"
    AlternatingRowBackground="#FFD0D0EB" RowBackground="#FFECECF5" FontSize="10.5"
    Grid.ColumnSpan="1" CellStyle="{StaticResource CellHighlighterStyle}"
    ColumnHeaderStyle="{StaticResource dataGridColumnHeader}" />

Шаблон / стиль заголовка:

<DataTemplate x:Key="RotateHeaderTemplate" >
    <TextBlock Text="{Binding}" Foreground="Blue" >
        <TextBlock.LayoutTransform>
            <RotateTransform Angle="-90" />
        </TextBlock.LayoutTransform>
    </TextBlock>
</DataTemplate>

И это то, что я до сих пор пытался изменить заголовок столбца (вызывается для события Window_Activated, как это вызывается после конструктора, когда дерево grid / WPF фактически построено):

Style newStyle = new System.Windows.Style()
{
    TargetType = typeof(DataGridColumn)
};

// SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#F70F49"))
newStyle.Setters.Add(new Setter(DataGridColumn.HeaderStringFormatProperty, new SolidColorBrush(Colors.Red)));
this.dgSkillsMatrix.Columns[4].HeaderStyle = newStyle;

1 Ответ

5 голосов
/ 15 декабря 2011

это не сработает.Есть много причин для этого.

  1. вы помещаете ЩЕТКУ в DataGridColumn.HeaderStringFormatProperty >> это не будет работать.
  2. это не будет передано заголовку столбца в любом случае.

, чтобы сделать это, вам нужно понимать, что dataContext DataGridColumnHeader НЕ установлен в соответствующий столбец по умолчанию.Вы должны настроить его вручную.

посмотрите на этот пост: https://stackoverflow.com/a/5249223/479384

Теперь, насколько вам интересно, я бы сделал что-то так же, как ввышеупомянутая ссылка:

добавьте необходимые свойства зависимостей в класс вашего 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";
}

(вместо Header = "my header text";, который у вас был ранее)

и, наконец, обновите ваш шаблон заголовка:

<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>

затем в вашем коде, когда вы захотите изменить заголовокbackground, просто сделайте:

((MyDataGridColumn)(this.dgSkillsMatrix.Columns[4])).ColumnHeaderBackground = Brushes.Red;

EDIT: если у вас нет специального класса для ваших столбцов, вы должны иметь возможность сделать это с прикрепленными свойствами, и вы всегда можетепоместите код, который я написал в конструктор, где-нибудь еще так:

myColumn.Header = myColumn;
myColumn.SetValue(columnHelper.ColumnHeaderTextProperty, "my Header Text");
myColumn.SetValue(columnHelper.ColumnHeaderBackgroundProperty, Brushes.Red);

отредактируйте для hashlock ^^

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...