无法将 CalendarDatePicker 绑定到 Xaml UWP 中的模型
Posted
技术标签:
【中文标题】无法将 CalendarDatePicker 绑定到 Xaml UWP 中的模型【英文标题】:Can't bind CalendarDatePicker to a model in Xaml UWP 【发布时间】:2017-06-17 04:03:09 【问题描述】:我在包含 datetime 属性的共享 PCL(适用于 android 和 uwp 应用程序)中有模型类:
public class Meter
public int meter_value get; set;
public DateTime meter_start get; set;
public DateTime meter_end get; set;
... other int and string properties
在 MainPage.cs 我有
public Meter _meter;
public MainPage()
this.InitializeComponent();
_meter = new Meter();
我正在尝试使用以下代码将此绑定到 xaml 控件:
<TextBox
Text="x:Bind _meter.meter_value, Mode=TwoWay">
<CalendarDatePicker
Name="meter_start"
Date="x:Bind _meter.meter_start, Mode=TwoWay"
DateFormat="day.integer/month.integer/year.full" >
</CalendarDatePicker>
此代码产生编译时错误:Invalid binding path '_meter.meter_start' : Cannot bind type 'System.DateTime' to 'System.Nullable(System.DateTimeOffset)' without a converter
当我将 x:Bind 更改为 Binding 时,应用程序编译,但我的模型中的meter_start 属性值为 0001/01/01。
有人可以帮我解决这个问题吗?
【问题讨论】:
【参考方案1】:正如错误所说,您需要一个转换器 - CalendarPicker.Date 是 Nullable<DateTimeOffset>
类型,而您的属性是 DateTime
。这是我测试过的一个简单示例 - 在代码中:
public class TimeConverter : IValueConverter
public object Convert(object value, Type targetType, object parameter, string language)
return new DateTimeOffset(((DateTime)value).ToUniversalTime());
public object ConvertBack(object value, Type targetType, object parameter, string language)
return ((DateTimeOffset)value).DateTime;
在 XAML 中:
<Page.Resources>
<local:TimeConverter x:Key="TimeConverter"/>
</Page.Resources>
... later
<CalendarDatePicker Name="meter_start" Date="x:Bind _meter.meter_start, Mode=TwoWay, Converter=StaticResource TimeConverter"
DateFormat="day.integer/month.integer/year.full"/>
如果您还从某处的代码中更改了_meter
,您可能会考虑实现INotifyPropertyChanged
并引发PropertyChanged 事件。
还要注意,当您处理 DateTime 和 DateTimeOffset 时,您需要注意适当的转换(时区等)。你会发现更多信息at this SO question。
【讨论】:
如果我在我的模型中做所有这些,会破坏我共享 PCL 的 android 可移植性吗? Meter 类在 UWP 和 Android 平台之间共享.. 肯定是这样吗? OP 绑定到“_meter.meter_start”,这是一个属性。我看不出为什么父对象必须是属性? 你是对的,它不一定是一个属性,尽管没有 RaisingProperty 用户界面不会知道更改。但问题在于转换器而不是这个。以上是关于无法将 CalendarDatePicker 绑定到 Xaml UWP 中的模型的主要内容,如果未能解决你的问题,请参考以下文章
将System.Globalization.DateTimeFormatInfo短日期格式转换为Windows.Globalization.DateTimeFormatting.DateTimeFor
无法将 [(ngModel)] 绑定到 Angular html