无法将CalendarDatePicker绑定到Xaml UWP中的模型

时间:2017-01-31 16:17:33

标签: c# xaml uwp uwp-xaml xamarin.uwp

我在包含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 to Binding时,应用编译,但我模型中meter_start属性的值为0001/01/01。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

由于错误显示您需要转换器,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