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 短日期字符串的主要内容,如果未能解决你的问题,请参考以下文章