これにはStringFormatを使用する必要があると思いますが、フォーマットを理解する方法については考えがありません。
2 に答える
入力値がTimeSpanまたはDateTimeの場合は、単純なフォーマット文字列を使用できます。しかし、そうではないと思います。
私の知る限り、独自のConverterを実装する必要があります。これは、引数として値を取り、フォーマットされた文字列を出力します。標準のCフォーマッターは、分を計算するために必要なモジュラスのような実際の計算を行うことはできません。
例:(このコードはチェックされていませんが、オンザフライで記述されています!)
public class MmSsFormatConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Int32 sss = (Int32)value;
Int32 ss = sss / 1000;
Int32 mm = ss / 60;
ss = ss % 60;
return string.Format(@"{0:D2}:{1:D2}", mm, ss);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return Binding.DoNothing; // Thanks to Danny Varod for the suggestion!
}
#endregion
}
次に、名前空間をXAMLに追加して、コンバーターを認識してから、コンバーターをXAMLのリソースとして追加します。
次に、次のようにコンバーターにバインドできます。
<TextBlock Text="{Binding Milliseconds, Converter={StaticResource MmSsFormatConverter}}" />
双方向バインディングを行う場合は、そのConvertBack関数を実装する必要があることに注意してください。また、パラメータ引数を使用して、フォーマット文字列のようにConverterParameterを渡すこともできます。
私が書いたコードに型チェックやその他の制約を追加したいかもしれません。(59:59を超える状況はどうですか?今は60:00になり、イベントは123:59に行くことができます)
コンバーターを作成したくない場合は、次のこともできます。
<TextBox Height="23" Text="{Binding Time, StringFormat={}{0:mm:ss}}" />
時間は、コードビハインドの特性である可能性があります。または、他の何かにバインドすることもできます。