在WP7上使用XAML格式化日期

9

有没有一种方法可以使用XAML格式化Windows Phone 7中的日期?

我尝试使用:

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

但是我遇到了错误:
属性“StringFormat”在类型“Binding”中未找到。
3个回答

20

在 SL4 中,这是可能的...

<TextBlock Text="{Binding Date, StringFormat='MM/dd/yyyy'}}"/>

在SL3中,您需要使用IValueConverter

public class DateTimeToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return String.Format("{0:MM/dd/yyyy}", (DateTime)value);
    }

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

如果您想要更加健壮的方法,您可以利用ConverterParameter

    public class DateTimeToStringConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
                if (parameter == null)
                    return ((DateTime)value).ToString(culture);
                else
                    return ((DateTime)value).ToString(parameter as string, culture);
        }

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

然后在您的XAML中,您需要首先将转换器定义为资源...

<namespace:DateTimeToStringConverter x:Key="MyDateTimeToStringConverter"/>

然后使用可接受的参数引用它,以格式化DateTime值...

<TextBlock Text="{Binding Date, 
         Converter={StaticResource MyDateTimeToStringConverter}, 
         ConverterParameter=\{0:M\}}"/>

1
由于性能影响,建议谨慎使用值转换器。特别是在列表框的上下文中需要注意这一点。我知道在这里需要平衡竞争优先级,这将因不同的人和不同的用途而有所不同。可以说,在手机上采用转换器最终会要求您放弃性能,并且单一方法可能更受欢迎。无论如何,将两种方法都记录在此处是可以的,读者可以根据自己的情况进行决定。 - Mick N
请参考http://blogs.claritycon.com/kevinmarshall/2010/10/27/wp7-development-tips-part-1/。 - Mick N
@Aaron - 我无法让它正常工作。当我添加以下内容时,我遇到了一个错误:<namespace:DateTimeToStringConverter x:Key="MyDateTimeToStringConverter"/>请问你有没有完整的示例可以从头到尾演示如何实现这个?错误显示为“DateTimeToStringConverter未找到”。 - webdad3
@Jeff V,您需要定义DateTimeToStringConverter类;命名空间将是转换器类所在的命名空间。 IValueConverter的MSDN文档有一个示例...http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx - Aaron McIver
我可能漏掉了一些东西,但最终我使用的ConverterParameter看起来更像这样:ConverterParameter='MMMM dd, yyyy'。 - SmartyP
显示剩余3条评论

2
据我所知,StringFromat是Silverlight 4的函数,而Windows Phone 7.0上的Silverlight基本上就是Silverlight 3加上一些额外的功能。那么我猜想答案是否定的。

0

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