XamDataGrid TimeSpan 型の値をバインドした場合、24時間を超える値は自動的に
「日.時:分:秒」形式(例:1.06:00:00)で表示されます。
本記事では、値を文字列に変換せずに、24時間を超えても「時:分:秒」形式(例:30:00:00)で表示する方法を紹介します。

🧩 背景と課題

  • TimeSpan 型には書式指定(フォーマット)機能がなく、Field.Format で書式を指定しても反映されません。
  • string 型にすれば表示は整えられますが、サマリー計算 や Excel出力 で不都合が生じることがあります。
  • そのため、データを TimeSpan 型のまま保持しつつ、表示時のみ文字列としてフォーマットする方法が必要です。

💡 解決方法

各フィールドの EditorStyle において、XamTextEditor ValueToDisplayTextConverter プロパティを利用し、TimeSpan 値を「hh:mm:ss」形式の文字列に変換します。

これにより:

  • バインドデータは TimeSpan 型のまま保持
  • セル表示時にのみ「時:分:秒」形式へ変換

が可能になります。

⚙️ 実装手順

1.コンバータクラスを定義します。

🧩 サンプル:TimeSpan → 「時:分:秒」文字列への変換

以下は、TimeSpan 型の値を 24時間を超えても “hh:mm:ss” 形式で表示するためのコンバーター実装例です。

namespace WpfApp_xamDataGrid_TimeSpan_converter
{
    internal class TotalHoursTimeSpanConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is TimeSpan ts)
            {
                // 総時間を取得(例:30時間の場合は30)
                int totalHours = (int)ts.TotalHours;
                return $"{totalHours:D2}:{ts.Minutes:D2}:{ts.Seconds:D2}";
            }
            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // 一方向バインディングの場合は実装不要
            throw new NotImplementedException();
        }
    }
}

2.XAMLで ValueToDisplayTextConverter を設定

XamTextEditor.ValueToDisplayTextConverter に変換用のコンバーターを設定します。

💻実行結果

✅ 24時間を超えても “hh:mm:ss” 形式で表示されます。

🔗 関連リンク

Tagged:

製品について

Ultimate UI for WPF