我们可以将Nullable <datetime>用作XAML中的DependencyProperty用于Metro风格的应用程序</datetime>

时间:2012-06-11 09:55:44

标签: c# xaml windows-8 microsoft-metro winrt-xaml

我正在尝试将DateTime?属性用作DependencyProperty,以便我可以在Metro风格的应用程序中将其绑定到XAML中。

然而,当应用程序运行时(在调试模式下),我收​​到绑定错误,并且日期没有显示在我的控件中:

  

错误:转换器无法转换类型'System.DateTime的值,   mscorlib,版本= 4.0.0.0,文化=中性,   PublicKeyToken = b77a5c561934e089'键入'DateTime&gt;';   BindingExpression:Path ='Model.Date'   DataItem ='MyProject.Common.ViewModel.TransactionViewModel,MyProject,   Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null';目标要素   是'MyProject.Controls.DatePicker'(Name ='null');目标属性是   'SelectedValue'(输入'DateTime&gt;')。

依赖属性定义如下:

public static readonly DependencyProperty SelectedValueProperty =
    DependencyProperty.Register("SelectedValue", 
                                typeof (System.Nullable<System.DateTime>),
                                typeof(DatePicker),
                                PropertyMetadata.Create(default(DateTime?)));

在XAML页面中,它用作:

<local:DatePicker  
   Margin="0,10" 
   SelectedValue="{Binding Model.Date, Mode=TwoWay}" 
   FontSize="21.333"/>

有关如何解决这个问题以及如何在控件中显示日期以及双向绑定的任何想法?

1 个答案:

答案 0 :(得分:6)

问题是DatePicker期望DateTime类型不是DateTime?,这是Nullable的语法糖。没有从DateTime?DateTime的隐式转换。写下你自己的IValueConverter。您可以退后一步并提出问题:您需要DateTime吗?您能否将不存在的日期表示为00/00/00?

另一种选择是在绑定之前转换它,例如

DateTime dateTime = nullDateTime ?? new DateTime(0, 0, 0, 0, 0, 0);