【问题标题】:Can't bind CalendarDatePicker to a model in Xaml UWP无法将 CalendarDatePicker 绑定到 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。

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

【问题讨论】:

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


    【解决方案1】:

    正如错误所说,您需要一个转换器 - CalendarPicker.DateNullable&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 用户界面不会知道更改。但问题在于转换器而不是这个。
    猜你喜欢
    • 2018-07-31
    • 2021-06-23
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    相关资源
    最近更新 更多