2012-04-03 28 views
0

WpfToolkitのDataGridを使用しています。私はそれのためのスタイルのリソース辞書を取って、それをちょっと微調整しました。私が達成しようとしているのは、データバインドされたオブジェクトの特定のプロパティがTrueのときにヘッダーを太字にすることです。列ヘッダーは、必ずしもTextBlockのではなく、下図のようにそのコントロールテンプレートを再定義しました:WPF DataGrid ColumnHeaderスタイル:ControlTemplateでテキストを太字にすることはできません

をDataGridStyle:

<Style x:Key="ModificationsDataGridStyle" TargetType="{x:Type compCtrls:ModDataGrid}"> 
    <Setter Property="ColumnHeaderStyle" Value="{StaticResource DatagridColumnHeaderCustomTemplateStyle}" /> 
</Style> 

ColumnHeaderStyle:

<Style x:Key="DatagridColumnHeaderCustomTemplateStyle" 
     TargetType="{x:Type primitives:DataGridColumnHeader}"> 
    <Setter Property="SnapsToDevicePixels" Value="True" /> 
    <Setter Property="MinWidth" Value="0" /> 
    <Setter Property="MinHeight" Value="28" /> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="FontWeight" Value="Normal" /> 
    <Setter Property="Cursor" Value="Hand" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type primitives:DataGridColumnHeader}"> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="Auto" /> 
        </Grid.ColumnDefinitions> 
        <Border x:Name="BackgroundBorder" BorderThickness="0,1,0,1" 
          Background="{StaticResource DataGridHeaderBackgroundBrush}" 
          BorderBrush="{StaticResource DataGridHeaderBorderBrush}" 
          Grid.ColumnSpan="2" /> 
        <ContentPresenter x:Name="ContentPres" Margin="6,3,6,3" VerticalAlignment="Center" /> 
        <Path x:Name="SortArrow" Visibility="Hidden" Data="M0,0 L1,0 0.5,1 z" Stretch="Fill" 
          Grid.Column="1" Width="10" Height="7" Fill="White" Margin="0,0,7,0" 
          VerticalAlignment="Center" RenderTransformOrigin="0.5,0.4" /> 
        <Rectangle Width="1" Fill="#AAC377" HorizontalAlignment="Right" Grid.ColumnSpan="2" /> 

        <Rectangle Width="1" Margin="0,0,1,0" Fill="#425B10" 
           HorizontalAlignment="Right" Grid.ColumnSpan="2" /> 
        <Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" 
          Style="{StaticResource ColumnHeaderGripperStyle}"/> 
        <Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" 
          Style="{StaticResource ColumnHeaderGripperStyle}"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="SortDirection" Value="{x:Null}"> 
         <Setter TargetName="SortArrow" Property="Visibility" Value="Collapsed" /> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" TargetName="BackgroundBorder" 
           Value="{StaticResource DataGridHeaderMouseOverBackgroundBrush}" /> 
         <Setter Property="BorderBrush" TargetName="BackgroundBorder" 
           Value="{StaticResource DataGridHeaderBorderBrush}" /> 
        </Trigger> 
        <Trigger Property="SortDirection" Value="Ascending"> 
         <Setter TargetName="SortArrow" Property="Visibility" Value="Visible" /> 
         <Setter TargetName="SortArrow" Property="Fill" Value="Goldenrod" /> 
         <Setter TargetName="SortArrow" Property="RenderTransform"> 
          <Setter.Value> 
           <RotateTransform Angle="180" /> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
        <Trigger Property="SortDirection" Value="Descending"> 
         <Setter TargetName="SortArrow" Property="Visibility" Value="Visible" /> 
         <Setter TargetName="SortArrow" Property="Fill" Value="Brown" /> 
        </Trigger> 
        <Trigger Property="DisplayIndex" Value="0"> 
         <Setter Property="Visibility" Value="Collapsed" 
           TargetName="PART_LeftHeaderGripper"></Setter> 
        </Trigger> 
        <DataTrigger Binding="{Binding IsRevisedSummableField}" Value="True"> 
         <Setter TargetName="ContentPres" Property="Control.FontWeight" Value="Bold" /> 
        </DataTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

は私が与えられたと結合したDataTriggerを(使用して思いましたプロパティ)が機能します。私は間違っているか、これを実行するうえで正しい道を歩いていない。私はまた、列が自動生成と列が生成されるとしている、私のような各のDataGridColumnのDataContextのを設定することを言及する必要があります:

protected override void OnAutoGeneratedColumns(EventArgs e) 
    { 
     var dataTable = pivotMod.DataTable; 
     foreach (DataGridColumn gridCol in Columns) 
     { 
      var colName = gridCol.Header.ToString(); 
      DataColumn col = dataTable.Columns[colName]; 

      // give the column headers a pretty name 
      gridCol.Header = col.Caption; 

      // set the datacontext of the gridcolumn to the modfield ... 
      ModFieldGUIWrapper modField = col.ExtendedProperties["ModField"] as ModFieldGUIWrapper; 
      gridCol.SetValue(FrameworkElement.DataContextProperty, modField); 
     } 
     base.OnAutoGeneratedColumns(e); 
    } 

すべてのヘルプは、いつものように大歓迎です。

乾杯、 ショーン

+0

あなたはすでにデータトリガーを試したと言いましたか?あなたは正しい部分に縛られましたか?あなたのコンテンツをTextblockに置き換えてから、TextBlockをあなたのContent Template Bindingにバインドしてから、代わりにあなたの要素としてバインドするのに使ったことがありますか?私が知る限り、DataTriggerはあなたが探しているものです。 –

答えて

0

理由が見つかり:

を私が正しく機能するためにDataTriggerに指定されたプロパティが含まれているデータオブジェクトにDataGridColumn.Headerを設定しておく必要があります。次に、自分のデータクラスのToString()メソッドをオーバーライドして、わたしが望んだかなりの名前を表示しました。

protected override void OnAutoGeneratedColumns(EventArgs e) 
    { 
     var dataTable = pivotMod.DataTable; 
     foreach (DataGridColumn gridCol in Columns) 
     { 
      var colName = gridCol.Header.ToString(); 
      DataColumn col = dataTable.Columns[colName]; 

      // set the datacontext of the gridcolumn to the modfield ... 
      ModFieldGUIWrapper modField = col.ExtendedProperties["ModField"] as ModFieldGUIWrapper; 
      gridCol.SetValue(FrameworkElement.DataContextProperty, modField); 

      // set the header to the data object so that the datatrigger's binding works!! 
      gridCol.Header = modField; 

     } 
     base.OnAutoGeneratedColumns(e); 
    } 

コメントありがとうございました。 :)

関連する問題