无法将 CalendarDatePicker 绑定到 Xaml UWP 中的模型 [英] Can't bind CalendarDatePicker to a model in Xaml UWP

查看:24
本文介绍了无法将 CalendarDatePicker 绑定到 Xaml UWP 中的模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在包含 datetime 属性的共享 PCL(适用于 android 和 uwp 应用程序)中有模型类:

public class Meter {公共 int meter_value {get;放;}公共日期时间 meter_start { 获取;放;}公共日期时间 meter_end { 获取;放;}... 其他 int 和 string 属性}

在 MainPage.cs 我有

public Meter _meter;公共主页(){this.InitializeComponent();_meter = new Meter();}

我正在尝试使用以下代码将其绑定到 xaml 控件:

 <日历日期选择器名称=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.

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

解决方案

由于错误提示您需要转换器 - CalendarPicker.Date 的类型为 Nullable 并且您的属性是 <代码>日期时间.这是我测试过的一个简单示例 - 在代码中:

公共类 TimeConverter : IValueConverter{公共对象转换(对象值,类型目标类型,对象参数,字符串语言){return new DateTimeOffset(((DateTime)value).ToUniversalTime());}公共对象 ConvertBack(对象值,类型目标类型,对象参数,字符串语言){返回 ((DateTimeOffset)value).DateTime;}}

在 XAML 中:

<local:TimeConverter x:Key="TimeConverter"/></Page.Resources>... 之后<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 事件.

还要注意,当您处理DateTimeDateTimeOffset 时,您需要注意适当的转换(时区等).您会在在这个 SO 问题中找到更多信息.

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?

解决方案

As the error says you need a converter - CalendarPicker.Date is of type Nullable<DateTimeOffset> and your property is DateTime. Here is a simple example I've tested - in the code:

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

and in 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}"/>

You may think of implementing INotifyPropertyChanged and raise the PropertyChanged event, if you also change the _meter from code somewhere.

Note also that when you deal with DateTime and DateTimeOffset, you need to take care of suitable conversion (time zones etc.). You will find some more info at this SO question.

这篇关于无法将 CalendarDatePicker 绑定到 Xaml UWP 中的模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆