2010-11-22 6 views
2

数値型の列をいくつか持ち、それらの列を右寄せにします。すべてのDataGridTextColumnsに既定のリソーススタイルを適用します。

<Window x:Class="MyApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Controls="clr-namespace:System.Windows.Controls;assembly=PresentationFramework" xmlns:Windows="clr-namespace:System.Windows;assembly=PresentationFramework" xmlns:Data="clr-namespace:System.Windows.Data;assembly=PresentationFramework" Title="MyApp" 
     Width="Auto" Height="Auto" SizeToContent="WidthAndHeight" Loaded="Window_Loaded"> 
    <Controls:DataGrid Name="MyDataGrid" IsReadOnly="True" 
      xmlns="http://schemas.microsoft.com/wpf/2008/toolkit" ItemsSource="{Data:Binding}" AutoGenerateColumns="True"> 
    <Controls:DataGrid.Columns> 
     <!-- This is a product name and is left justified by default --> 
     <Controls:DataGridTextColumn Header="ProductName" Binding="{Data:Binding Path=ProductName}" /> 
     <!-- The rest of the columns are numeric and I would like for them to be right justified --> 
     <Controls:DataGridTextColumn Header="ProductId1" Binding="{Data:Binding Path=ProductId1}" > 
     <Controls:DataGridTextColumn.ElementStyle> 
      <Windows:Style TargetType="Controls:TextBlock"> 
      <Windows:Setter Property="HorizontalAlignment" Value="Right"/> 
      </Windows:Style> 
     </Controls:DataGridTextColumn.ElementStyle> 
     </Controls:DataGridTextColumn> 
     <Controls:DataGridTextColumn Header="ProductId2" Binding="{Data:Binding Path=ProductId2}" > 
     <Controls:DataGridTextColumn.ElementStyle> 
      <Windows:Style TargetType="Controls:TextBlock"> 
      <Windows:Setter Property="HorizontalAlignment" Value="Right"/> 
      </Windows:Style> 
     </Controls:DataGridTextColumn.ElementStyle> 
     </Controls:DataGridTextColumn> 
     <Controls:DataGridTextColumn Header="ProductId3" Binding="{Data:Binding Path=ProductId3}" > 
     <Controls:DataGridTextColumn.ElementStyle> 
      <Windows:Style TargetType="Controls:TextBlock"> 
      <Windows:Setter Property="HorizontalAlignment" Value="Right"/> 
      </Windows:Style> 
     </Controls:DataGridTextColumn.ElementStyle> 
     </Controls:DataGridTextColumn> 
     <!-- More numeric columns follow... --> 
    </Controls:DataGrid.Columns> 
    </Controls:DataGrid> 
</Window> 

右寄せスタイルは、最初の列以外のすべてに対して繰り返され、冗長であるように見えます。このグリッド内のDataGridTextColumnsを右寄せに設定できるのであれば、最初の列を明示的に左寄せするだけで済みます。おそらくスタイルをリソースとして使用して、これをどうやって行うことができますか?より良い方法がありますか?

答えて

7

DataGridTextColumnはFrameworkElementから派生しないため、すぐに使用できるようにスタイルを作成することはできません。

あなたがしていることを行う最も簡単な方法は、DataGridCellのスタイルを作成してそこからTextBlockを右揃えにすることです。更新にこの

<Controls:DataGrid ...> 
    <Controls:DataGrid.Resources> 
     <Windows.Style TargetType="Controls:DataGridCell"> 
      <Windows.Setter Property="TextBlock.HorizontalAlignment" Value="Right"/> 
     </Windows.Style> 
    </Controls:DataGrid.Resources> 
    <Controls:DataGrid.Columns> 
     <!-- This is a product name and is left justified by default --> 
     <Controls:DataGridTextColumn Header="ProductName" 
            Binding="{Binding Path=ProductName}" 
            CellStyle="{x:Null}"/> 

を持つべきではない列に対して

を(またはあなたが望むかもしれない他のスタイル)しかし、あなたはスタイルを適用したいならば:次にCellStyle = {ヌルX}を設定しますDataGridTextColumnにこのようなものが必要です。

まず、「スタイルを保持できる」ヘルパークラスが必要です。その中に、私たちがStyle(FrameworkElementにない)にできるようにしたいすべてのプロパティを追加します。この場合ElementStyle。

public class DataGridTextColumnStyleHelper : FrameworkElement 
{ 
    public DataGridTextColumnStyleHelper(){} 
    public static readonly DependencyProperty ElementStyleProperty = 
     DependencyProperty.Register(
      "ElementStyle", 
      typeof(Style), 
      typeof(DataGridTextColumnStyleHelper)); 
    public Style ElementStyle 
    { 
     get { return (Style)GetValue(ElementStyleProperty); } 
     set { SetValue(ElementStyleProperty, value); } 
    } 
} 

その後、我々は、XAMLで

<Style x:Key="DataGridTextColumnStyle" 
     TargetType="local:DataGridTextColumnStyleHelper"> 
    <Setter Property="ElementStyle"> 
     <Setter.Value> 
      <Style TargetType="TextBlock"> 
       <Setter Property="HorizontalAlignment" Value="Right"/> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

をスタイルを追加し、我々はTextColumnStyleプロパティで別のヘルパークラスが必要DataGridTextColumnにこのスタイルを適用できるようにします。その中で、リフレクションとSetValueを使ってスタイルを適用します。

public class MyDataGridHelper : DependencyObject 
{ 
    private static readonly DependencyProperty TextColumnStyleProperty = DependencyProperty.RegisterAttached(
     "TextColumnStyle", 
     typeof(Style), 
     typeof(MyDataGridHelper), 
     new PropertyMetadata(MyPropertyChangedCallback)); 
    public static void SetTextColumnStyle(DependencyObject element, string value) 
    { 
     element.SetValue(TextColumnStyleProperty, value); 
    } 
    public static Style GetTextColumnStyle(DependencyObject element) 
    { 
     return (Style)element.GetValue(TextColumnStyleProperty); 
    } 
    private static void MyPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if (DesignerProperties.GetIsInDesignMode(d) == true) 
     { 
      return; 
     } 
     DataGridTextColumn textColumn = (DataGridTextColumn)d; 
     Style textColumnStyle = e.NewValue as Style; 
     foreach (SetterBase setterBase in textColumnStyle.Setters) 
     { 
      if (setterBase is Setter) 
      { 
       Setter setter = setterBase as Setter; 
       if (setter.Value is BindingBase) 
       { 
        //Not done yet.. 
       } 
       else 
       { 
        Type type = textColumn.GetType(); 
        PropertyInfo propertyInfo = type.GetProperty(setter.Property.Name); 
        propertyInfo.SetValue(textColumn, setter.Value, null); 
       } 
      } 
     } 
    } 
} 

最後に、我々はこの

<DataGridTextColumn Header="ProductId1" Binding="{Binding Path=ProductId1}" 
    local:MyDataGridHelper.TextColumnStyle="{StaticResource DataGridTextColumnStyle}"> 
ようDataGridTextColumn上のスタイルを使用することができます
関連する問題