【发布时间】: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