WPF 绑定 StringFormat 短日期字符串

Posted

技术标签:

【中文标题】WPF 绑定 StringFormat 短日期字符串【英文标题】:WPF Binding StringFormat Short Date String 【发布时间】:2011-06-30 02:33:16 【问题描述】:

我想在 WPF 中使用短日期命名字符串格式。

我尝试了类似的方法:

<TextBlock Text="Binding Date, StringFormat='Short Date'" />

如何做到这一点?

【问题讨论】:

【参考方案1】:

试试这个:

<TextBlock Text="Binding PropertyPath, StringFormat=d" />

这是文化敏感的,需要 .NET 3.5 SP1 或更高版本。

注意:这是区分大小写的。 “d”是short date format specifier,而“D”是long date format specifier。

MSDN page on Standard Date and Time Format Strings 上有完整的字符串格式列表,this MSDN blog post 上有所有选项的更完整说明

但是,有一个问题 - 它始终以美国格式输出日期,除非您自己将文化设置为正确的值。

如果不设置此属性,绑定引擎将使用绑定目标对象的Language 属性。在 XAML 中,这默认为“en-US”或从页面的根元素(或任何元素)继承值(如果已显式设置)。

Source

一种方法是在后面的代码中(假设您已将线程的文化设置为正确的值):

this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);

另一种方法是在绑定中设置转换器文化:

<TextBlock Text="Binding PropertyPath, StringFormat=d, ConverterCulture=en-GB" />

虽然这不允许您本地化输出。

【讨论】:

无论文化设置如何,这是否总是输出美国格式? @CRice - 是的 - 出于某种原因 - 你自己设定了文化。 谢谢,当 UI "d" 输出与同一日期对象的 xaml.cs "d" 不同时,非常糟糕。 引用 WPF 文化错误,我只是添加 this.Language = System.Windows.Markup.XmlLanguage.GetLanguage(System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag);在每个窗口中初始化组件之后;【参考方案2】:

或将其用于英语(或将其混合用于自定义)格式:

StringFormat='0:dd/MM/yyyy'

【讨论】:

您还可以在绑定中使用“ConverterCulture=” - 这需要一个值来指示格式。 (ConverterCulture='en-GB' 是英国)。【参考方案3】:

使用StringFormat 属性(或ContentControl 及其派生类上的ContentStringFormat,例如Label)。

<TextBlock Text="Binding Date, StringFormat=0:d" />

注意标准String.Format 位置参数表示法之前的 允许在标记扩展语言中转义大括号。

【讨论】:

将允许您使用StringFormat='Created Date:0:d',否则会产生意想不到的结果。【参考方案4】:

我发现一些 DateTime StringFormat 示例很有用。来自C# Examples

DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);

String.Format("0:y yy yyy yyyy", dt);  // "8 08 008 2008"   year
String.Format("0:M MM MMM MMMM", dt);  // "3 03 Mar March"  month
String.Format("0:d dd ddd dddd", dt);  // "9 09 Sun Sunday" day
String.Format("0:h hh H HH",     dt);  // "4 04 16 16"      hour 12/24
String.Format("0:m mm",          dt);  // "5 05"            minute
String.Format("0:s ss",          dt);  // "7 07"            second
String.Format("0:f ff fff ffff", dt);  // "1 12 123 1230"   sec.fraction
String.Format("0:F FF FFF FFFF", dt);  // "1 12 123 123"    without zeroes
String.Format("0:t tt",          dt);  // "P PM"            A.M. or P.M.
String.Format("0:z zz zzz",      dt);  // "-6 -06 -06:00"   time zone

【讨论】:

【参考方案5】:

注意字符串格式的单引号。 这不起作用:

    Content="Binding PlannedDateTime, StringFormat=0:yy.MM.dd HH:mm"

虽然这样做:

    Content="Binding PlannedDateTime, StringFormat='0:yy.MM.dd HH:mm'"

【讨论】:

【参考方案6】:

只需使用:

<TextBlock Text="Binding Date, StringFormat=\0:d\" />

【讨论】:

【参考方案7】:

如果你想添加一个带有值的字符串,使用这个:

<TextBlock Text="Binding Date, StringFormat= 'Date : 0:d'" />

【讨论】:

以上是关于WPF 绑定 StringFormat 短日期字符串的主要内容,如果未能解决你的问题,请参考以下文章

WPF StringFormat 格式化文本

WPF StringFormat 格式化文本

WPF StringFormat 格式化文本

WPF-数据绑定:日期时间格式

WPF中DataGrid控件怎么修改显示时间日期的格式

WPF - 从 XAML 中的 StringFormat 绑定属性访问属性值