无法将 CalendarDatePicker 绑定到 Xaml UWP 中的模型
Can't bind CalendarDatePicker to a model in Xaml UWP
我在共享 PCL(针对 android 和 uwp 应用程序)中有模型 class,其中包含日期时间 属性:
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 更改为绑定时,应用程序编译,但我的模型中 meter_start 属性 的值是 0001/01/01。
谁能帮我解决这个问题?
正如错误所说,您需要一个转换器 - 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}"/>
您可能会考虑实施 INotifyPropertyChanged
并引发 PropertyChanged 事件,如果您还从某处的代码更改 _meter
。
另请注意,当您处理 DateTime 和 DateTimeOffset 时,您需要注意适当的转换(时区等) .您会找到更多信息 at this SO question.
我在共享 PCL(针对 android 和 uwp 应用程序)中有模型 class,其中包含日期时间 属性:
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 更改为绑定时,应用程序编译,但我的模型中 meter_start 属性 的值是 0001/01/01。
谁能帮我解决这个问题?
正如错误所说,您需要一个转换器 - 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}"/>
您可能会考虑实施 INotifyPropertyChanged
并引发 PropertyChanged 事件,如果您还从某处的代码更改 _meter
。
另请注意,当您处理 DateTime 和 DateTimeOffset 时,您需要注意适当的转换(时区等) .您会找到更多信息 at this SO question.