2

I have model class in shared PCL (for android and uwp app) that contain datetime property:

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
}

In MainPage.cs i have

public Meter _meter;
public MainPage()
{
    this.InitializeComponent();
    _meter = new Meter();
}

I'm trying to bind this to a xaml controls with following code:

   <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>

This code produce compile time error: Invalid binding path '_meter.meter_start' : Cannot bind type 'System.DateTime' to 'System.Nullable(System.DateTimeOffset)' without a converter

When i change x:Bind to Binding, applicaton compile, but value of meter_start property in my model is 0001/01/01.

Can someone help me how to solve this?

4

1 回答 1

7

正如错误所说,您需要一个转换器- 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}"/>

如果您还在某处更改了 from 代码,您可能会考虑实现INotifyPropertyChanged并引发PropertyChanged事件。_meter

另请注意,当您处理DateTimeDateTimeOffset时,您需要注意适当的转换(时区等)。您将在这个 SO question 中找到更多信息。

于 2017-01-31T16:23:02.180 回答