2016-09-04 21 views
1

DataGridItemsSourceにはSystem.Data.DataTableがバインドされています。このDataTableは、実行時にいくつかのテキスト列といくつかのブール型列で埋められます。期待どおり、テキスト列はDataGridTextColumnと表示され、ブール値の列はDataGridCheckBoxColumnと表示されます。これまでのところ問題ありません。今度は、チェックボックス列の列ヘッダを垂直方向に表示します。だから私はこのようなスタイルを定義した:WPF-特定のDataGridColumnHeaderにLayoutTransformを適用する方法

<Style x:Key="ColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}"> 
    <Style.Triggers> 
     <!--<Trigger Property=??? Value=???> 
      <Setter Property="LayoutTransform"> 
       <Setter.Value> 
        <RotateTransform Angle="270"/> 
       </Setter.Value> 
      </Setter> 
     </Trigger>--> 
    </Style.Triggers> 
</Style> 

を問題は、コードにコメント-asですが、私は私が唯一からを適用するために、スタイルのために使用すべきトリガの種類がわかりませんDataGridCheckBoxColumnと他の種類の列ではありません。何か案は?

答えて

1

両方の要件を満たすために:

  • タイミング:ItemSourceが
  • フィルターを設定された後、ヘッダをフリップ:スタイルのみに適用されなければなりませんCheckBoxColumns

あなたは添付行動に訴えることができます:

DataGridColumnsBehavior.cs

public static class DataGridColumnsBehavior 
{ 
    public static readonly DependencyProperty 
     FlipHeaderProperty = 
      DependencyProperty.RegisterAttached("FlipHeader", 
       typeof(bool), typeof(DataGridColumnsBehavior), 
        new PropertyMetadata(FlipHeaderChanged)); 

    public static bool GetFlipHeader(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(FlipHeaderProperty); 
    } 
    public static void SetFlipHeader(DependencyObject obj, bool value) 
    { 
     obj.SetValue(FlipHeaderProperty, value); 
    } 

    private static void FlipHeaderChanged(DependencyObject d, 
     DependencyPropertyChangedEventArgs args) 
    { 
     var grid = d as DataGrid; 
     var flip = (bool)grid.GetValue(FlipHeaderProperty); 
     if (grid == null 
     || grid.Columns.Count == 0 
     || flip == false) return; 

     foreach (var column in grid.Columns) 
     { 
      if (column.GetType() == typeof(DataGridCheckBoxColumn)) 
       column.HeaderStyle = 
        (Style)grid.FindResource("CheckBoxColumnHeaderStyle"); 
     } 
    } 
} 

XAML

<DataGrid ItemsSource="{Binding Collection}" 
      funk:DataGridColumnsBehavior.FlipHeader="{Binding Flip}"> 
    <DataGrid.Resources> 
     <Style x:Key="CheckBoxColumnHeaderStyle" 
       TargetType="{x:Type DataGridColumnHeader}"> 
      <Setter Property="LayoutTransform"> 
       <Setter.Value> 
        <RotateTransform Angle="270"/> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DataGrid.Resources> 
</DataGrid> 

タイミングはフリッププロパティによって制御されています。 Collectionを変更するたびに、Flipをfalseに設定してから、もう一度trueに設定します。列が反復され、DataGridCheckBoxColumnsのヘッダーが反転されます。これが実装される方法に注意してください.Flipをfalseに設定すると何も行われないので、ヘッダーは元に戻されません。

EDIT

だけAutoGeneratingColumn eventを使用して、短い方法について学び:

<DataGrid ItemsSource="{Binding Collection}" 
      AutoGeneratingColumn="dataGrid_AutoGeneratingColumn"> 
    <DataGrid.Resources> 
     <Style x:Key="CheckBoxColumnHeaderStyle" 
       TargetType="{x:Type DataGridColumnHeader}"> 
      <Setter Property="LayoutTransform"> 
       <Setter.Value> 
        <RotateTransform Angle="270"/> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DataGrid.Resources> 
</DataGrid> 

ハンドラの部分クラスで

private void dataGrid_AutoGeneratingColumn(object sender, 
    DataGridAutoGeneratingColumnEventArgs e) 
{ 
    DataGrid grid = sender as DataGrid; 
    // Only DataGridCheckBoxColumns 
    if (e.PropertyType == typeof(bool)) 
     e.Column.HeaderStyle = 
      (Style)grid.FindResource("CheckBoxColumnHeaderStyle"); 
} 
+0

これは本当に良い答えでした。私はそのようなことが可能であることを知らなかった –

0

あなたのコードをチェックしましたが、なぜトリガーを使いたいのですか?

私の次のコードを確認してください。

<DataGridCheckBoxColumn.ElementStyle> 
       <Style TargetType="CheckBox"> 
        <Setter Property="VerticalAlignment" Value="Center" /> 
       </Style> 
      </DataGridCheckBoxColumn.ElementStyle> 

よろしく、

メッシ

+0

真剣に、あなたが質問を読んでいます? –

関連する問題