无法将 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&lt;DateTimeOffset&gt; 类型,而您的属性是 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 事件。

还要注意,当您处理 DateTimeDateTimeOffset 时,您需要注意适当的转换(时区等)。你会发现更多信息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

QML - 无法将组合框模型绑定到变体列表项

Viewstub 无法将 stringresource 传递给数据绑定

无法将按钮绑定到 AVPlayer

无法将参数“消息”绑定到类型 ServiceBusReceivedMessage