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フレームワーク入門〜コンバータによるデータ変換