如何使用 XAML 标记扩展将 DateTime 转换为字符串?

How do I use a XAML markup extension to convert a DateTime into a string?

我创建了一个标记扩展来将 DateTime 转换为字符串

public class DateTimeConverterExtension : IMarkupExtension<string> {
    public DateTime Source { get; set; }
    public string ProvideValue(IServiceProvider serviceProvider) {
        var delta = DateTime.Now -Source;
        if (delta.TotalDays > 0) {
            return string.Format(StringResources.DaysAgo, delta.TotalDays);
        }
        if (delta.TotalHours > 0) {
            return string.Format(StringResources.HoursAgo, delta.TotalHours);
        }
        if (delta.TotalMinutes > 0) {
            return string.Format(StringResources.MinutesAgo, delta.TotalMinutes);
        }
        return string.Format(StringResources.MinutesAgo, 0);
    }

    object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider) {
        return (this as IMarkupExtension<string>).ProvideValue(serviceProvider);
    }
}

但是当我在 XAML 中使用它时:

<Label Text="{markupExtensions:DateTimeConverter Source={Binding Time}}" />

我收到以下错误:

No property, BindableProperty, or event found for "Source", or mismatching type between value and property.

我哪里错了?

您可以使用转换器转换日期时间。

要使用 Converter,您需要创建一个 class 来实现 IValueConverter 接口

代码如下:

public class DatetimeToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return string.Empty;

        var datetime = (DateTime)value;
        //put your custom formatting here
        return datetime.ToLocalTime().ToString("g");
    }

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

然后在xaml中使用它:

<ResourceDictionary>
    <local:DatetimeToStringConverter x:Key="cnvDateTimeConverter"></local:DatetimeToStringConverter>
</ResourceDictionary>
...
<Label Text="{Binding Date, Converter={StaticResource cnvDateTimeConverter}}"></Label>