TimeSpan
プロパティにバインドされているテキストブロックをフォーマットしようとしています。プロパティがDateTime
型の場合は機能しますが、TimeSpan
の場合は失敗します。コンバーターを使用して処理できます。しかし、私は他の選択肢があるかどうかを見つけようとしています。
サンプルコード:
public TimeSpan MyTime { get; set; }
public Window2()
{
InitializeComponent();
MyTime = DateTime.Now.TimeOfDay;
DataContext = this;
}
Xaml
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
テキストブロックに時間と分のみが表示されることを期待しています。ただし、次のように表示されます。
19:10:46.8048860
.NET 3.5では、代わりにMultiBindingを使用できます
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}:{1}">
<Binding Path="MyTime.Hours"/>
<Binding Path="MyTime.Minutes"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
更新
コメントに答えるため。
時間または分が0〜9の場合でも2桁を出力するには、{0}の代わりに{0:00}を使用できます。これにより、時刻12:01の出力が12:1ではなく12:01になります。
01:01を1:01として出力する場合は、StringFormat="{}{0}:{1:00}"
また、 条件付き書式設定 を使用して、分のマイナス記号を削除できます。 {1:00}の代わりに{1:00; 00}を使用できます
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0:00}:{1:00;00}">
<Binding Path="MyTime.Hours" />
<Binding Path="MyTime.Minutes" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
フォーマット文字列は、DateTime
ではなく、TimeSpan
で機能することを目的としています。
代わりにDateTime.Now
で動作するようにコードを変更できます。あなたのxamlは大丈夫です:
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
更新
そして 。Net 4 からTimeSpan
を次のようにフォーマットします:
<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>
プールに追加するために、このバインディングを使用して、実稼働WPFアプリでTimeSpanを表示しています。
Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"
バックスラッシュを正しくしようといくつか試みました:)
StringFormat
は、フォーマット文字列の形式である必要があります。この場合、次のようになります。
<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>
注:合計時間数と分数を表示する場合、タイムスパンがたまたま24時間を超えている場合、アプローチには警告があります: ここに回避策があります 。
マルチバインディングの場合、.NET 4以降に注意する必要があります。
.NET 4.6でテストされた以下の短い概要:
正規バインディング:
<TextBlock Text="{Binding Start, StringFormat='{}{0:hh\\:mm\\:ss}'}" />
マルチバインディング:
<TextBlock.Text>
<MultiBinding StringFormat="{}{0:hh':'mm':'ss} -> {1:hh':'mm':'ss}">
<Binding Path="Start" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
<Binding Path="End" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
</MultiBinding>
</TextBlock.Text>
または、マルチバインディングで'の代わりに"を使用できます。
<MultiBinding StringFormat='{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}'>
注:StringFormat = "{} {0:hh \:\:mm \:ss}-> {1:hh \:mm \:ss}"not MultiBindingで動作します。これにより、結果が空白になります。
.NET 4のWPFには文字列からのタイムスパンがあります http://msdn.Microsoft.com/en-us/library/ee372286.aspx
次の<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
を使用しています
私はこの質問が今では古いことを知っていますが、StringFormat
で直接動作するこの単純なTimeSpan
を誰も提案していないことに驚いています:
<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>
Contentプロパティを使用するラベルでStringFormatを使用する場合は、ContentStringFormatを使用してタイムスパンをフォーマットできます。
<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"