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

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

我尝试了类似的方法:

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

如何做到这一点?

【问题讨论】:

    标签: wpf xaml binding


    【解决方案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}'}" />
          

          【讨论】:

            猜你喜欢
            • 2013-10-17
            • 2013-03-12
            • 1970-01-01
            • 2011-08-17
            • 2011-03-11
            • 1970-01-01
            • 2017-02-16
            • 2011-05-28
            • 1970-01-01
            相关资源
            最近更新 更多