如何在XAML中格式化TimeSpan


92

我正在尝试格式化绑定到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


您还记得2010年运行的.Net版本吗?我在Windows Phone XAML中遇到类似的问题: stackoverflow.com/q/18679365/1001985
McGarnagle 2013年

注意:所有格式开头的{}是转义序列,而不是格式说明符。这会导致XAML允许使用该格式的其他方括号,而无需反斜杠。
Grault 2014年

Answers:


88

在.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:00}代替{0}。这将确保时间12:01的输出是12:01,而不是12:1。
如果要将01:01输出为1:01,请使用StringFormat="{}{0}:{1:00}"

并且条件格式可用于在几分钟内消除负号。可以使用{1:00; 00}代替{1:00}

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0:00}:{1:00;00}">
            <Binding Path="MyTime.Hours" />
            <Binding Path="MyTime.Minutes" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

@chibacity:谢谢!我已经相信了您的答案,所以我无法再次执行它。很不错的还有
弗雷德里克Hedblad

1
如果分钟部分只有一位数字,则不会输出“ 10:1”或“ 4:9”吗?
Cygon 2011年

@Cygon:有关如何解决此问题的信息,请参见我更新的答案。使用{0:D2}代替{0}
Fredrik Hedblad 2012年

这将输出“ -07:-12”,表示持续时间为7小时12分钟。如果持续时间为负7小时,则输出为“ -07:00”。但只要那里有一个负的持续时间非零分钟,负附加到.Hours以及为.Minutes
tzippy

我想显示@FredrikHedblad TotalMinutes而不是显示Minutes分钟(显示时间跨度最长为1个小时)。但是TotalMinutes属性为双格式,因此使用<Binding Path="MyTime.TotalMinutes" />产生的舍入输出进行绑定是不好的-我需要显示截断的值而不是舍入。无需使用自定义值转换符就可以将double截断为int吗?
多米尼克帕洛

139

格式字符串适用于DateTime而不是TimeSpan

您可以改为更改代码以使用DateTime.Now。您的xaml很好:

<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>

更新资料

.Net 4格式开始TimeSpan,如下所示:

<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>

是的...但是我正在寻找可以格式化Timespan值的方式。
biju 2010年

1
我从日期集合中过滤出时间部分,采取了与众不同的方式,按照我的逻辑进行
排序

@biju我已使用TimeSpan的格式字符串更新了示例。
蒂姆·劳埃德

2
我不知道我做错了什么..但它在这里仍然对我不起作用。VisualStudio2008,Framework 3.5
biju 2010年

1
这是正确的答案,而不是上面标记的答案。即使对于点网3.5,也应使用转换器代替建议的答案。
MikeKulls 2012年

44

仅添加到池中,我就成功使用此绑定在生产WPF应用程序中显示TimeSpan:

Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"

进行了一些尝试以使反斜杠正确:)


5
如果您想转至几分之一秒,也需要转义逗号:{0:hh \\:mm \\:ss \\。ffff}
Rashack

StringFormat = \ {0:hh \\:mm \\:ss \\。fff \}
Stepan Ivanenko

一直以来,我的最大错误是我像DateTime格式的字符串一样使用了H。但是显然,TimeSpan没有12/24格式...
M Stoerzel

22

StringFormat必须采用格式字符串的形式。在这种情况下,它看起来像:

<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>

注意:如果要显示小时和分钟总数,并且时间跨度大于24小时,则需要注意以下事项这是一种解决方法


@biju-更新的语法。缺少StringFormat值周围的单引号。
彼得·利勒沃尔德

是的,正如@chibacity示例所示,必须使用双\来逃脱:
Peter Lillevold 2010年

1
确实,这仅适用于.Net 4.0!在.Net 3.5中,格式字符串完全被忽略。
彼得·利勒沃尔德

2
另请注意,这确实适用于TextBlock,但不适用于带有Label的NOT(!)。
ckle铐

2
仅当Binding的目标是String类型的属性时,才使用@Shackles StringFormat。Label.Content是Object,因此将被忽略。TextBlock.Text是一个字符串,因此已使用。
15ee8f99-57ff-4f92-890c-b56153 '16

16

从.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 \:\:毫米\:SS} - > {1:HH \:毫米\:SS}”上的MultiBinding工作,这将导致一个空白的结果。


13

我知道这个问题现在已经很老了,但是令我惊讶的是,没有人建议使用这种简单的方法StringFormat,它可以TimeSpan直接用于:

<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>

2
对此有很多困惑。好像可能与.NET 4改变的语法
McGarnagle


8

如果要在使用Content属性的Label中使用StringFormat,可以使用ContentStringFormat设置时间跨度:

<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"

您在答案中陈述的内容应加倍强调:在使用该Content属性(即,Text例如a TextBlock的属性)的XAML控件中,ContentStringFormat 必须使用该属性。指定StringFormat为绑定的一部分将不起作用。
非正式的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.