【问题标题】:How do I use a XAML markup extension to convert a DateTime into a string?如何使用 XAML 标记扩展将 DateTime 转换为字符串?
【发布时间】:2021-10-10 14:37:30
【问题描述】:

我创建了一个标记扩展来将 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}}" />

我收到以下错误:

找不到“源”的属性、BindableProperty 或事件,或者值和属性之间的类型不匹配。

我哪里做错了?

【问题讨论】:

  • 这听起来应该是一个ValueConverter
  • 你是对的,谢谢。这解决了我的问题。我仍然想知道为什么我的示例不起作用。
  • 可能在构造函数中调用 InitializeComponent 时失败,在设置 BindingContext 之前。 MarkupExtension 已运行,但找不到有效的源。相反,ValueConverter 是 Binding 表达式的一部分;在存在 BindingContext 之前不会调用它。我认为您将在标记中看到的唯一绑定是 x:Static 值。

标签: xaml xamarin xamarin.forms


【解决方案1】:

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

要使用 Converter,您需要创建一个实现 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>

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 2018-12-01
    • 2018-03-21
    • 2019-11-28
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多