如何在Windows Store通用应用程序(W8.1 + WP8.1)中格式化日期?

10

我正在玩弄新的Windows Store通用应用程序模板,可用于Windows 8.1和Windows Phone 8.1,并想知道如何在XAML代码中格式化字符串。

我尝试过的方法(XAML):

 <TextBlock Text="{Binding TestItem.CurrentDate, StringFormat={}{0:MM/dd/yyyy}}" />

问题在于StringFormatWindows.UI.Xaml.Controls.TextBox中不可用。

微软创建了一个示例项目,专门讲解日期格式化。但是,该示例中使用的方法基于(丑陋的)代码后台。

所以,这里是我的问题:

  • StringFormat为什么在Windows存储通用应用程序中不可用?
  • 如何仅使用XAML代码格式化字符串?


编辑: 我决定使用转换器解决方案,对于那些感兴趣的人,这是代码:

public class DateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null)
            return null;

        if (!(value is DateTime))
            return null;

        var dateTime = (DateTime)value;

        var dateTimeFormatter = new DateTimeFormatter(YearFormat.Full,
            MonthFormat.Full,
            DayFormat.Default,
            DayOfWeekFormat.None,
            HourFormat.None,
            MinuteFormat.None,
            SecondFormat.None,
            new[] { "de-DE" },
            "DE",
            CalendarIdentifiers.Gregorian,
            ClockIdentifiers.TwentyFourHour);

        return dateTimeFormatter.Format(dateTime);
    }

    public object ConvertBack(object value, Type targetType, object parameter,
        string language)
    {
        throw new NotImplementedException();
    }
}

我很高兴能够得到任何改进上面代码的建议,欢迎留言。

感谢Mikael Dúi Bolinder和Martin Suchan提供的建议/答案。


1
也许你应该创建一个转换器? - Mikael Dúi Bolinder
是的,那是一个选项,但在我确认没有其他更好的方法之前,我不想这样做。 - Joel
1
你是如何在标记中链接转换器的?我尝试了所有的STaticResource、Relative等组合,但都失败了。另外一件事:我觉得缺少StringFormat很荒谬。现在已经是2014年和.NET 4.5了。在讨论Windows Phone 8.1的所有会议中,竟然没有人提到DataBound控件上的日期格式化吗? - J. Minjire
@JohnK:太对了,我已经不理解微软了。最近我开始失去信心。 - Joel
完全同意,我写WP8.1代码的时候越来越怀疑他们是否知道自己在做什么。我浪费了几个小时尝试做一些我认为只需要用.ToString("dd/mm/yyyy")就能完成的事情,现在我放弃了,正在等待这篇帖子的帮助。摇头! - J. Minjire
虽然转换器对我来说已经可以工作了,但它仍然感觉更像是一种变通方法。你介意去StackOverflow上提问解释一下你的问题吗? - Joel
1个回答

7

在Windows Runtime项目类型中,数据绑定不支持StringFormat属性,您可以选择以下选项:

  • 将已格式化的日期作为ViewModel中的只读属性使用。
  • 使用转换器 - 您甚至可以创建StringFormatConverter,在其中将DateTime格式作为ConverterParameter传递。 这里提供了如何使用此类StringFormatConverter的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接