2017-10-11 3 views
1

私がしようとしたのはDataGridTextColumnsDatagridのワードラップを適用するためにこのように明示的に設定することなくStyleを作成することです。AttachedPropertyを介してすべてのDataGridTextColumnsにスタイルを設定します

<DataGrid ItemsSource="{Binding Lines}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Column1" Binding="{Binding Path=Result1}"> 
      <DataGridTextColumn.ElementStyle> 
       <Style TargetType="{x:Type TextBlock}"> 
        <Setter Property="TextWrapping" Value="Wrap"/> 
       </Style> 
      </DataGridTextColumn.ElementStyle> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

DataGridTextColumnFrameworkElementではありませんので、残念ながら直接以下のようにいくつかのStyleを使用することはできません。

<Style TargetType="{x:Type TextBlock}" x:Key="WrapText"> 
    <Setter Property="TextWrapping" Value="Wrap"/> 
</Style> 

私はRayBurnsでこの回避策https://stackoverflow.com/a/2640862/5381620を発見し、それが働いているかを把握しようとしていました。しかし、私はプロパティが追加されていないので、なぜ機能していないのか理解していません。

C#のコードは大丈夫のようです。

public class MyDataGridHelper : DependencyObject 
{ 
    private static readonly DependencyProperty TextColumnStyleProperty = DependencyProperty.RegisterAttached("TextColumnStyle", typeof(Style), typeof(MyDataGridHelper), new PropertyMetadata 
    { 
     PropertyChangedCallback = (obj, e) => 
     { 
      var grid = (DataGrid)obj; 
      if (e.OldValue == null && e.NewValue != null) 
       grid.Columns.CollectionChanged += (obj2, e2) => 
       { 
        UpdateColumnStyles(grid); 
       }; 
     } 
    }); 

    public static void SetTextColumnStyle(DependencyObject element, Style value) 
    { 
     element.SetValue(TextColumnStyleProperty, value); 
    } 
    public static Style GetTextColumnStyle(DependencyObject element) 
    { 
     return (Style)element.GetValue(TextColumnStyleProperty); 
    } 

    private static void UpdateColumnStyles(DataGrid grid) 
    { 
     var style = GetTextColumnStyle(grid); 
     foreach (var column in grid.Columns.OfType<DataGridTextColumn>()) 
      foreach (var setter in style.Setters.OfType<Setter>()) 
       if (setter.Value is BindingBase) 
        BindingOperations.SetBinding(column, setter.Property, (BindingBase)setter.Value); 
       else 
        column.SetValue(setter.Property, setter.Value); 
    } 
} 

私は完全に混乱してしまったのは、スタイルセッターを見つけ出すときです。 現在、私は明らかに動作していないされ、このようにそれをしようとしているが、実際に私はこのTargetTypeが本当にどのように見えるかの手掛かりを持っていません。

<local:MyDataGridHelper.TextColumnStyle> 
    <Style TargetType="FrameworkElement"> 
     <Setter Property="TextBlock.TextWrapping" Value="Wrap"/> 
    </Style> 
</local:MyDataGridHelper.TextColumnStyle> 

答えて

1

あなたは添付プロパティの値に列のElementStyleを設定する必要があります。

public class MyDataGridHelper : DependencyObject 
{ 
    private static readonly DependencyProperty TextColumnStyleProperty = 
     DependencyProperty.RegisterAttached("TextColumnStyle", typeof(Style), typeof(MyDataGridHelper), new PropertyMetadata 
    { 
     PropertyChangedCallback = (obj, e) => 
     { 
      var grid = (DataGrid)obj; 
      if (e.OldValue == null && e.NewValue != null) 
       grid.Columns.CollectionChanged += (obj2, e2) => 
       { 
        UpdateColumnStyles(grid); 
       }; 
     } 
    }); 

    public static void SetTextColumnStyle(DependencyObject element, Style value) 
    { 
     element.SetValue(TextColumnStyleProperty, value); 
    } 
    public static Style GetTextColumnStyle(DependencyObject element) 
    { 
     return (Style)element.GetValue(TextColumnStyleProperty); 
    } 

    private static void UpdateColumnStyles(DataGrid grid) 
    { 
     var style = GetTextColumnStyle(grid); 
     foreach (var column in grid.Columns.OfType<DataGridTextColumn>()) 
      column.ElementStyle = style; 
    } 
} 

用途:

<DataGrid> 
    <local:MyDataGridHelper.TextColumnStyle> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Foreground" Value="Red"/> 
      <Setter Property="TextWrapping" Value="Wrap"/> 
     </Style> 
    </local:MyDataGridHelper.TextColumnStyle> 
    ... 
</DataGrid> 
+0

一つの小さな追加を。これにより、すべての列のスタイル全体がオーバーライドされます。 1つの列に個別の情報が必要な場合は、単にセッターを追加するだけです。 静的ボイドUpdateColumnStyles(データグリッドグリッド) {VAR origStyle = GetTextColumnStyle(グリッド)。 foreachの(grid.Columns.OfTypeにおけるVARカラム()){ するvar newStyle =新しいスタイル()。 newStyle.BasedOn = column.ElementStyle。 newStyle.TargetType = origStyle.TargetType; foreach(varSetter in origStyle.Setters.OfType ()) { \t newStyle.Setters.Add(setter); } column.ElementStyle = newStyle。 } } – pedrito

関連する問題