Q042. DataGrid のセルの値を書式設定したいのですが・・・

A. コンバータークラスを用意し、 Binding.Converter プロパティに設定します。


以下の例は、数値データを単純に #,##0 形式で表示するサンプルです。
Double や Decimal 型のデータをバインドすると少数点以下を 123,456.00 と表示してしまうことがあるので、書式を指定して小数点以下の値を表示しないようにします。


まず IValueConverter インターフェイスを実装するクラスを用意します。

/// <summary>
/// 数値を指定書式に変換するコンバーター
/// </summary>
public class NumericFormatConverter : IValueConverter
{
    public string Format { get; set; }

    public NumericFormatConverter() {
        Format = "#,##0";
    }
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        string ret = "0";
        if ( value != null && IsNumeric(value) ) {
            ret = ((decimal)value).ToString(Format);
        }
        return ret;
    }

    public static bool IsNumeric(object value) {
        decimal ret;
        return decimal.TryParse(value.ToString(), NumberStyles.Any, null, out ret);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        decimal ret = 0m;
        decimal.TryParse(value.ToString(), NumberStyles.Any, null, out ret);
        return ret;
    }
}


次に作成したクラスを XAML のリソースに定義します。事前にプロジェクトを XML 名前空間で定義しとくことを忘れずに。このサンプルでは 「local」 としています。

<local:NumericFormatConverter x:Key="numericConverter" />


DataGridTextColumn の Binding.Converter にリソースを指定します。リソース経由めんどくさいと思って Converter={StaticResource numericConverter} と書いたら、実行時に XamlParseException 例外が発生しました。詳しい仕組みはまだ判ってませんが、リソース経由でないとだめみたいです。

<DataGridTextColumn Header="高速料金" Width="45*" 
    Binding="{Binding Path=tollway, Converter=local:numericConverter}" >
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}" >
            <Setter Property="Margin" Value="2" />
            <Setter Property="TextAlignment" Value="Right" />
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

実行するとこうなります。データは Decimal 型でコンバーター使う前は小数点が表示されていたのが、指定した書式どおりにひょうじされるようになりました。でも、この例だと判りにくいかも(汗)



関連記事WPF/Silverlight UIフレームワーク入門〜コンバータによるデータ変換


WPF FAQ の目次に戻る