当DatePicker.SelectedDate设置为null时,默认转换失败

时间:2013-12-30 16:00:13

标签: wpf datetime nullable datetimepicker ivalueconverter

我将DateTime?的属性绑定到DatePicker的SelectedDate和DisplayDate属性。它的行为完全符合我的要求,但我在VS Output窗口中注意到了这个错误。

System.Windows.Data Error: 23 : Cannot convert '<null>' from type '<null>' to type 'System.DateTime' for 'en-US' culture with default conversions; consider using Converter property of Binding. NotSupportedException:'System.NotSupportedException: 'DateTimeValueSerializer' ValueSerializer cannot convert from '(null)'.
   at System.Windows.Markup.DateTimeValueSerializer.ConvertFromString(String value, IValueSerializerContext context)
   at System.Xaml.Replacements.DateTimeConverter2.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
   at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)'

我已经能够通过将null转换为DateTime.Now或其他默认日期来删除错误,但这不是我想要的行为 - 我的DatePicker应该显示“选择日期”当值为null时,就像现在一样。

我应该特别努力消除这个错误吗?

如果是这样,我该如何处理?

其他

有问题的DatePickerControlTemplate ContentControl的一部分。这是我正在做的略微提炼的版本:

<ContentControl Content="{Binding Path=MyDateProperty, Mode=TwoWay}">
    <ContentControl.Template>
        <ControlTemplate TargetType="ContentControl">
            <DatePicker DisplayDate="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"
                        SelectedDate="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"/>
        </ControlTemplate>
    </ContentControl.Template>
</ContentControl>

实际上,选择了模板并在代码中设置了绑定,但这会产生我看到的错误。

1 个答案:

答案 0 :(得分:0)

您可以按照以下方式解决。我是从Here

获得的
internal class DateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(value != null)
            return ((DateTime)value).ToShortDateString()
        return "Select a date";
    }
}

将班级导入XAML-Code

xmlns:converter="clr-namespace:PathToTheFolderWhereTheClassDateConverterIs2
Binding data into XAML

<DatePicker Height="25">
    <DatePicker.Text>
        <Binding Path="FieldToBind" UpdateSourceTrigger="PropertyChanged">
            <Binding.Converter>
                <converter:DateConverter>
            </Binding.Converter>
        </Binding>
    </DatePicker>