对于Not-Nullable日期,DatePicker数据绑定将默认值设置为1/1/0001 WPF c#

时间:2014-03-23 06:53:30

标签: wpf datagrid

这是1/1/0001问题的“扩展”问题: Original Question

原始Q.解决方案 - 将DateTime字段设置为可为空(DateTime?)解决了这个问题。

当基础字段必须 NOT NULL?

时,解决方案是什么?

(在这种情况下,绑定会导致DataGrid列Date Time Picker将其自身设置为01/01/0001)

我的案例中的实际实体是由实体框架6生成的。

2 个答案:

答案 0 :(得分:2)

如果我错了,请纠正我。使用01/01/0001填充非空字段以指示它为空。 (不推荐)

一种解决方案是定义转换器。像这样的东西:

public class NotNullDateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var aDateTime = value as DateTime;
        if (aDateTime != null && aDateTime == .... )
            return null

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后,您可以为转换器定义一个静态字段,以便稍后在xaml中使用它。

public static NotNullDateConverter NotNullDateConverter = new NotNullDateConverter();

然后在xaml中使用此转换进行绑定:

SelectedDate="{Binding Path=DueDate, Converter={x:Static local:SomeClass.NotNullDateConverter}}"

答案 1 :(得分:2)

我遇到了完全相同的问题,所以我写了一个可以清除非日期的转换器。

//Just weeds out non-dates. Format should be set with StringFormat on the binding
public class DateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        DateTime date = (DateTime)value;
        if (date != null && date.Year != 1)
        {
            return date;
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我这样使用它:

<DataTemplate.Resources>
    <logic:DateConverter x:Key="DateConverter"/>
</DataTemplate.Resources>
<TextBlock Text="{Binding LastUpdateTime, StringFormat={}{0:MM/dd/yyyy H:mm:ss}, Converter={StaticResource DateConverter}}"/>