2012-01-26 32 views
2

WPF DataGridに条件付き書式を適用しようとしています。要件は次のとおりです。グリッド上の任意のセルについて、内容が整数の場合、表示形式は小数点以下第0位にする必要があります。内容に小数点以下の桁がある場合は、文字列形式で定義されているデフォルト値に表示します。WPF DataGridCellの条件付き書式設定

このような条件付き書式をどのように達成することができるかについて、誰かが考えていますか?私は小数点の存在を確認できるコンバータを作成しましたが、私はこれを自分のXAMLでセルスタイルまたはテキストカラムにどのように適用できるかを考え出すことができませんでした。

セルスタイル - 私はこのコラム

<DataGridTextColumn x:Key="ColumnName" 
        Header="ColumnName" 
        SortMemberPath="MyColumnSort" 
        Binding="{Binding myColBinding, StringFormat={}{0:N2}}" 
        IsReadOnly="True" 
        Width="40" /> 

コンバータに適用されるスタイルを適用するだろう - - 私はこれを使用します。これは、私が

<Style x:Key="MyCellStyle" TargetType="DataGridCell"> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
</Style> 

グリッド列を定義したいスタイルですこのスタイルが適用されるかどうかを判断します。

public class NoDecimalConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      int converted; 
      int.TryParse(value.ToString(), out converted); 
      value.ToString(); 
      return int.TryParse(value.ToString(), out converted); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

私は以下のように私のセルスタイルにdatatriggerを追加することによって、それを実行しようとしましたが、私はタイプ 『System.Windows.Controls.DataGridCell』オンスタイルプロパティ 『StringFormat』が見つかりません」というエラーを得ました。 "

<Style x:Key="MyCellStyle" TargetType="DataGridCell"> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
     <Style.Triggers>    
      <DataTrigger Binding="{Binding NoDecimalConvertor}" Value="False" >     
       <Setter Property="StringFormat" Value="true" />    
      </DataTrigger>   
     </Style.Triggers>  
</Style> 

私は、任意のガイダンスがこれにアプローチする最良の方法にとしていただければ幸いですので、日本に対して私の頭を強打されています。

答えて

3

現在、コンバーターは文字列値から整数を解析できるかどうかを示すブール値を返しています。代わりに、次のようなものを試してください:

public class NoDecimalConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     int converted; 
     if (int.TryParse(value.ToString(), out converted)) 
      return converted.ToString(); 

     double convertedDouble; 
     if (double.TryParse(value.ToString(), out convertedDouble)) 
      return convertedDouble.ToString(); 

     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

これは、最初にintを解析し、成功すると(文字列として)返します。そうでない場合は、doubleを試して返します。ここで任意の文字列形式を指定して小数点以下の桁数を取得できます。最後に、どちらかを解析できない場合は、元の値が返されます。

次に、あなたの列に使用していることを設定することができます。

<DataGridTextColumn x:Key="ColumnName" 
       Header="ColumnName" 
       SortMemberPath="MyColumnSort" 
       Binding="{Binding myColBinding, Converter={StaticResource MyConverter}}" 
       IsReadOnly="True" 
       Width="40" /> 

注:MyConverterのキーでどこかのリソースで、あなたのコンバータをインスタンス化する必要がありますが。

デフォルトの小数点以下の桁数を指定できるようにするには、コンバータのパラメータとして渡すことができます。

+0

ありがとうございました。それは私が必要としていた通りに正確に機能 – DB101

関連する問題