2016-09-04 3 views
1

J'ai un DataGrid dont ItemsSource est lié à un System.Data.DataTable. Ce DataTable est rempli à l'exécution avec quelques colonnes de texte et quelques colonnes booléennes. Comme prévu, les colonnes de texte sont affichées en tant que DataGridTextColumn et les colonnes booléennes sont affichées en tant que DataGridCheckBoxColumn. Pas de problème jusqu'à présent. Maintenant, je veux que les en-têtes de colonnes des colonnes de la case à cocher soient affichées verticalement. Donc je définissais un style comme celui-ci:WPF- Comment appliquer LayoutTransform à un DataGridColumnHeader spécifique

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

Le problème est -comme commenté dans le code, je ne sais pas quel genre de déclencheur que je devrais utiliser pour le style pour être appliqué seulement pour laDataGridCheckBoxColumn s et pas d'autres types de colonnes. Des idées?

Répondre

1

Pour remplir les conditions requises:

  • Timing: Flip têtes après ItemSource est réglé
  • Filtre: Le style doit être appliqué à CheckBoxColumns

Vous pouvez recourir à des comportements Attached:

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> 

Le moment est contrôlé par une propriété Flip. Chaque fois que la collection est modifiée, définissez Flip sur false, puis sur true à nouveau. Les colonnes sont itérées et les en-têtes des DataGridCheckBoxColumns sont inversés. Notez la façon dont ce paramètre est implémenté. Retourner à false ne fait rien, donc les en-têtes ne sont pas retournés.

EDIT

vient d'apprendre d'une méthode plus courte, en utilisant la 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> 

Handler en classe partielle

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

C'était une très bonne réponse. Je ne savais pas que de telles choses sont possibles –

0

J'ai vérifié votre code, pourquoi vouliez-vous utiliser Trigger?

S'il vous plaît vérifier mon code suivant si c'est ce que vous voulez.

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

Cordialement,

Messi

+0

Sérieusement, avez-vous lu la question ?? –