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 に変換用のコンバーターを設定します。
💻実行結果
