2011-07-20 33 views
4

私のアプリケーションでDataGridセルのスタイルを作成しようとしています。 DataGridの数値セルをDataTriggerを使用して右揃えする方法があるかもしれません。これも可能ですか?私のDataGridのWPF Datagrid数値列を右揃え

私のスタイルはこれです:

<Style TargetType="{x:Type DataGrid}"> 
    <Setter Property="AlternatingRowBackground"> 
     <Setter.Value> 
      <SolidColorBrush Color="#CCCCCC" /> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="CanUserAddRows" Value="False" /> 
    <Setter Property="CanUserDeleteRows" Value="False" /> 
    <Setter Property="Background"> 
     <Setter.Value> 
      <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> 
       <GradientStop Offset="0" Color="#CCCCCC" /> 
       <GradientStop Offset="1" Color="#FFFFFF" /> 
      </LinearGradientBrush> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="RowHeaderWidth" Value="0" /> 
    <Setter Property="CellStyle"> 
     <Setter.Value> 
      <Style TargetType="{x:Type DataGridCell}"> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Background"> 
          <Setter.Value> 
           <SolidColorBrush Color="#7777FF" /> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

私は多分コンテンツは、int型、ダブル、小数点(数値であるかどうかを検出するためにCellStyle上のトリガのいくつかの種類を追加すると思っています... )、それに応じてセルのスタイルを設定します。これは可能ですか?これについて考える

更新

私はいくつかのことを試してみたが、それはうまくいきませんでした。 IsNumericConverter

<DataTrigger Binding="{Binding Converter={StaticResource IsNumericConverter}}" Value="True"> 
    <Setter Property="HorizontalContentAlignment" Value="Right" /> 
</DataTrigger> 

:私はのように定義DataTrigger使用試み

public class IsNumericConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value is int || (value is decimal || value is double); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 

をしかし、私は、コンバータにブレークポイントを設定するとI値は、行全体の型ではないことを得ます各個別のセル...

答えて

1

これを行う1つの方法は、コードビハインドでトリガーを設定することです。次のメソッドは、DataGridColumnにトリガーを適用します。このトリガーは、右の位置合わせを行うかどうかを決定するためにあなたのIsNumericConverterを使用しています。

public static void AddTriggerToColumnStyle(DataGridColumn column) 
    { 
     var boundColumn = column as DataGridBoundColumn; 
     if (boundColumn != null && boundColumn.Binding is Binding) 
     { 
      string bindingPropertyPath = (boundColumn.Binding as Binding).Path.Path; 
      column.CellStyle = new Style() 
      { 
       BasedOn = column.CellStyle, 
       TargetType = typeof(DataGridCell), 
       Triggers = 
       { 
        new DataTrigger 
        { 
         Binding = new Binding(bindingPropertyPath) { Converter = new IsNumericConverter() }, 
         Value = true, 
         Setters = 
         { 
          new Setter 
          { 
           Property = TextBlock.TextAlignmentProperty, 
           Value = TextAlignment.Right 
          } 
         } 
        } 
       } 
      }; 
     } 
    } 

この方法は、コードビハインドのコンストラクタでInitializeComponent()後に呼び出しても安全でなければなりません。

この方法は、列に数値データと非数値データが混在している場合に有効です。列に1つのタイプのデータのみが含まれている場合でも、この方法は引き続き有効ですが、作成されたトリガーは決して起動しないか、永続的に放置されます。

もちろん、DataGridを使用する各コントロールのコードビハインドで上記の方法を繰り返す必要はありません。静的ユーティリティクラスに移動し、すべてのコードビハインドクラスでこのメソッドを呼び出すことができます。あなたはそれを渡すDataGridの列をループし、各列に対して上記のメソッドを呼び出す静的ユーティリティメソッドを追加することもできます。

UPDATE:上記の方法を変更して、binding property-pathを推測できるようにしました。それにより、使いやすくなります。また、メソッドpublicstaticを作成して、静的ユーティリティクラスに移動できることを確認しました。

私は、DataGridのすべての列を実行し、バインディングを調べ、バインドされたプロパティの型を推定し、列に右揃えを適用するというアプローチを考えました。これは決して発火しないか、または永久に解雇されるトリガーを作成するのを避け、それぞれの列に1つのタイプのデータが少ししかない場合に適しています。しかし、このアプローチはコードビハインドを伴い、各行がバインドされる型を渡す必要があり、バインディングproperty-pathsには単一のプロパティ名以上のものが含まれていると複雑になります。

私は恐怖ですStyleだけを使用し、コードビハインドを避けるこの問題に対する解決策は見当たりません。

+0

これは間違いなくこれです。私はすべてのセル/列(各列は1つの型の値を持つ)のスタイルを定義したかったので、数字の場合(double、int、decimal、...)、右揃えになります。 –

+0

@Carles:上記の方法を使いやすくするために私の答えを更新しました。上記のメソッドを静的ユーティリティクラスのどこかに設定し、すべてのDataGridカラムをループする静的ユーティリティメソッドを追加すると、このメソッドをDataGridごとに1行追加することができます。おそらく、これはあなたのために良いでしょうか? –

+0

私はそれを試してみましょう。ありがとう! –

1

私はこれが3歳であることを知っていますが、コードビハインドにコードを追加することなくこれを行うことができました。この記事をモデルとして使用してください:link

これは、コンバータに行を渡すという元の問題を回避する方法としてマルチバインディングを使用しています。

あなたのデータグリッドにこれを追加します。

CellStyle="{StaticResource CellRightAlignStyle }" 

は、あなたのXAMLにこのスタイルを追加し、あなたがリソースとして追加する必要があります。

<Window.Resources> 

    <Style x:Key="CellRightAlignStyle" TargetType="{x:Type DataGridCell}"> 
     <Setter Property="HorizontalAlignment"> 
      <Setter.Value> 
       <MultiBinding 
        Converter="{converters:IsNumericConverter}" > 
        <MultiBinding.Bindings> 
         <Binding RelativeSource="{RelativeSource Self}"/> 
         <Binding Path="Row" Mode="OneWay"/> 
        </MultiBinding.Bindings> 
       </MultiBinding> 
      </Setter.Value> 
     </Setter> 
    </Style> 

</Window.Resources> 

その後コンバータ:

public object Convert(
     object[] values, 
     Type targetType, 
     object parameter, 
     CultureInfo culture) 
    { 
    if (values[1] is DataRow) 
     { 
      //change the text alignment left or right. 
      var cell = (DataGridCell)values[0]; 
      var row = (DataRow)values[1]; 
      var columnName = cell.Column.SortMemberPath; 

      if (row[columnName] is int || (row[columnName] is decimal || row[columnName] is double)) 
      return System.Windows.HorizontalAlignment.Right; 
     } 
    return System.Windows.HorizontalAlignment.Left; 
    } 

    public override object ConvertBack(
     object value, 
     Type targetType, 
     object parameter, 
     CultureInfo culture) 
    { 
     return null; 
    } 

これはすべて今数値データを含むセルが右揃えになっている必要があります!

+0

非常に便利ですが、メモとして - 右揃えは本当に整数のためだけに機能します。浮動小数点値は小数点で整列する必要がありますが、Horizo​​ntalAlignmentのオプションではありません。 – marklam

関連する問題