2011-12-15 2 views
0

WPF 프로젝트 창에 WPF DataGrid이 있습니다. 그리드에 DataTable을 채우고 (불행히도 필연적으로) 열을 자동 생성하고 특정 기타 요인에 따라 열의 헤더 색을 변경해야한다는 요구 사항이 있습니다.런타임에 자동 생성 열이있는 WPF DataGrid의 열 머리글 색을 변경하십시오.

강조 표시해야하는 열 이름 목록이 있으며이 열을 기반으로 색인을 쉽게 알아낼 수 있습니다 (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 이벤트에서 호출 (변경 얻기 위해 지금까지 시도한 것입니다 그리드/WPF 트리가 실제로 생성 될 때 생성자 다음에 호출 됨).

+0

이유는'HeaderStringFormat'에'Colors.Red을 설정하는 스타일이다 '? – Rachel

+0

텍스트를 강조 표시하려고 할 때 주위를 놀고 있었는데, 이는 허용 될 수 있지만 전체 "머리글"셀을 강조 표시합니다. 이것은 작동하지 않았지만 여전히 실행되었고 WPF 예외는 제공하지 않았습니다. –

+1

'HeaderStringFormat'은 일반적으로 색상이 아닌''M/d/yy ''나''#, ## 0.00 "'같은 것이기 때문에 궁금합니다. – Rachel

답변

5

이것처럼 작동하지 않습니다. 거기에는 여러 가지 이유가 있습니다.

  1. DataGridColumn.HeaderStringFormatProperty에 브러쉬를 넣고 있습니다. >>이 기능은 작동하지 않습니다.
  2. 이것은 어쨌든 열 머리글로 전송되지 않습니다.

이 작업을 수행하려면 DataGridColumnHeader의 dataContext가 기본적으로 해당 열로 설정되어 있지 않다는 것을 이해해야합니다. 수동으로 설정해야합니다.

이 게시물을 살펴 있습니다 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); } 
} 

은 다음과 같이 당신의 열의 생성자에서 데이터 컨텍스트를 설정 머리글의 배경을 변경하고자 할 때 그냥 뒤에 코드에서, 다음

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

:

마지막 (대신 이전에 있던 Header = "my header text";의) 0

는, 헤더 템플릿을 업데이트 수행

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

편집 : 당신이 당신의 열을위한 특별 클래스가없는 경우, 당신은이 위스콘신 할 수 있어야 연결된 속성을 토륨, 당신은 항상 내가 다른 곳과 같이 생성자에서 작성한 코드를 넣을 수 있습니다 : hashlock ^^ 대한

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

편집을

+0

죄송합니다 - 우연히 투표가 종료되었습니다! 편집하면 되돌릴 수 있습니다. – hashlock

+0

: - D ok, 단지 당신이 나를이 월요일 아침에 웃게 만들었 기 때문에.^ – David

+0

붐 - 완료. 당신의 월요일을 밝게 기쁘다! – hashlock

관련 문제