2011-12-15 4 views
0

WPFプロジェクトウィンドウにWPF DataGridがあります。私はグリッドにDataTableを設定し、列を自動生成しました(残念なことに必要性)、他の特定の要因に応じて列のヘッダーカラーを変更する必要があります。実行時に自動生成された列を含むWPFデータグリッドの列ヘッダーの色を変更します。

私は、強調表示が必要な列名のリストを持っており、これに基づいてインデックスを簡単に把握することができます(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のツリーが実際に構築されたときに、コンストラクタの後に呼ばれる):

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; 
+0

なぜ、あなたのスタイルは 'Colors.Redに' HeaderStringFormat'を設定しているが'? – Rachel

+0

私はただテキストを強調表示しようとしていましたが、それは受け入れられるでしょうが、ヘッダーセル全体を強調表示したいと思います。これは機能しませんでしたが、WPFの例外を何も実行していませんでした。 –

+1

'HeaderStringFormat'は、通常、' 'M/d/yy" 'や' '#、## 0.00" 'のようなもので、色ではないので不思議でした。 – Rachel

答えて

5

これはこのようには動作しません。それには多くの理由があります。

  1. DataGridColumn.HeaderStringFormatPropertyにBRUSHを設定しています>>これは機能しません。
  2. これは、とにかく列のヘッダーに転送されません。

これを行うには、DataGridColumnHeaderのdataContextがデフォルトで対応する列に設定されていないことを理解する必要があります。手動で設定する必要があります。

は、この記事を見て:https://stackoverflow.com/a/5249223/479384

今限り、あなたが懸念しているとして、私は上記のmentionnedリンクと同様に何かをしたい:

はあなたが必要とする依存関係プロパティを追加しますあなたの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のを設定します。

あなたは、ヘッダーの背景を変更したいときだけ、後ろのあなたのコードでは、その後、

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

EDIT:あなたの列のための特別なクラスを持っていない場合、あなたはこれのwiを行うことができるはず添付プロパティ番目の、そしてあなたはいつも私がどこかにこのようなコンストラクタで書いたコードを置くことができます。hashlockため

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

編集^^

+0

おっと - 誤ってダウン投票しました!編集すると元に戻します。 – hashlock

+0

:-D ok、ちょうどあなたが今月曜日の朝に私を笑わせたから^^ – David

+0

ブーム - 完了。あなたのmondayを明るくすることをうれしい! – hashlock

関連する問題