CalendarDatePicker 绑定空值

Oli*_*ias 6 c# asp.net xaml model-binding uwp

I\xc2\xb4m 使用 CalendarDatePicker

\n\n
<CalendarDatePicker x:Name="DatePick" DisplayMode="Decade" Date="{Binding DisplayValue, Mode=TwoWay}"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是当我绑定日期属性时,选择器不再显示默认占位符文本(选择日期),而是如果属性为 null(属性始终设置为 null),则现在显示 01.01.1916。

\n\n
public DateTimeOffset? DisplayValue {get;set;}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我手动将 null 作为 Date 的值,它现在会再次显示 PlaceholderText。

\n\n
DatePick.Date=null;\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且绑定仍然有效/我在选择日期时得到了所需的值。\n那么是否有可能在不使用隐藏代码的情况下显示占位符文本?

\n

Asi*_*eña 3

似乎calendardatepicker“最小值”始终是当前年份减去100,我已将您的代码修改为:

  public class CalendarDatePickerEx : CalendarDatePicker
  {
    public DateTimeOffset? DefaultValue { get; set; }

    public static readonly DependencyProperty DefaultValueProperty =
      DependencyProperty.Register("DefaultValue", typeof(DateTimeOffset), typeof(CalendarDatePickerEx), new PropertyMetadata(null, (sender, e) =>
      {
        if ((DateTimeOffset?)e.NewValue != null && ((CalendarDatePickerEx)sender).Date.Value.Date.Year == DateTime.Today.Year - 100)
        {
          ((CalendarDatePickerEx)sender).SetDisplayDate((DateTimeOffset)e.NewValue);
          ((CalendarDatePickerEx)sender).Date = null;
        }
        else if ((DateTimeOffset?)e.NewValue == null && ((CalendarDatePickerEx)sender).Date.Value.Date.Year == DateTime.Today.Year - 100)
        {
          {
            ((CalendarDatePickerEx)sender).SetDisplayDate(DateTimeOffset.Now);
            ((CalendarDatePickerEx)sender).Date = null;
          }
        }
      }));
  }
Run Code Online (Sandbox Code Playgroud)

首选解决方案

如果您使用 x:Bind 而不是 Binding,则一切都会按预期工作,并且如果绑定日期值为 null,您可以看到占位符。

直接在XAML页面中:

<CalendarDatePicker Date="{x:Bind DataContext.DisplayValue, Mode=TwoWay}"/>
Run Code Online (Sandbox Code Playgroud)

或在 DataTemplate 内:

<DataTemplate x:Key="DateFieldItemTemplate"
              x:DataType="DataModel:ObjectTypeWithDate">
    <Grid>
        <CalendarDatePicker Date="{x:Bind DateField, Mode=TwoWay}"/>
    </Grid>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)