我正在尝试格式化绑定到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
答案 0 :(得分:132)
格式字符串适用于DateTime
,而不是TimeSpan
。
您可以更改代码以使用DateTime.Now
。你的xaml很好:
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
<强>更新强>
从.Net 4格式TimeSpan
格式如下:
<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>
答案 1 :(得分:83)
在.NET 3.5中,您可以使用MultiBinding
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}:{1}">
<Binding Path="MyTime.Hours"/>
<Binding Path="MyTime.Minutes"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<强>更新强>
回答评论。
要确保输出2位数,即使小时或分钟为0-9,您也可以使用{0:00}而不是{0}。这将确保时间12:01的输出为12:01而不是12:1
如果要以1:01输出01:01,请使用StringFormat="{}{0}:{1:00}"
并且Conditional formatting可用于删除分钟的负号。而不是{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>
答案 2 :(得分:37)
只是要添加到池中,我已成功使用此绑定在生产WPF应用程序中显示TimeSpan:
Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"
尝试使反斜杠正确:)
答案 3 :(得分:21)
StringFormat
必须采用格式字符串的形式。在这种情况下,它看起来像:
<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>
注意:如果您想显示总小时数和分钟数,且时间跨度恰好超过24小时,那么您的方法有一个警告:Here's a workaround。
答案 4 :(得分:14)
对于Multi绑定,您需要注意.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} - &gt; {1:hh \:mm \:ss}”将不在MultiBinding上工作,这将导致空白结果。
答案 5 :(得分:12)
.NET 4中的WPF现在具有字符串http://msdn.microsoft.com/en-us/library/ee372286.aspx
的时间跨度我使用以下<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
答案 6 :(得分:10)
我知道这个问题现在已经过时了,但我很惊讶没有人建议这个简单的StringFormat
可以直接用于TimeSpan
:
<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>
答案 7 :(得分:6)
如果要在使用Content属性的Label中使用StringFormat,可以使用 ContentStringFormat 格式化时间跨度:
<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"
答案 8 :(得分:3)
TimeSpan StringFormat(以毫秒为单位):
<TextBlock Text="{Binding MyTime, StringFormat=\{0:hh\\:mm\\:ss\\.fff\}}"/>
答案 9 :(得分:0)
小米解决方案是这样的:
(根据需要多次复制元素 0)
<TextBlock Text="{Binding MyTime, StringFormat='{0:hh}:{0:mm}'}"/>