【问题标题】:DatePicker databinding sets default value to 1/1/0001 WPF c# for a Not-Nullable dateDatePicker 数据绑定将默认值设置为 1/1/0001 WPF c# 对于不可为空的日期
【发布时间】:2014-03-23 06:53:29
【问题描述】:

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

原来的Q.解决方案—— 将 DateTime 字段设置为可为空(DateTime?)可以解决此问题。

当底层字段必须为NOT NULL 时,解决办法是什么?

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

在我的例子中,实际实体是由 Entity Framework 6 生成的。

【问题讨论】:

  • 为什么不简单地添加验证?在您的视图模型中使用可为空的日期时间,当您想要转到您的模型时验证您的日期。
  • 我的问题是向网格添加新行时。当我更新时,我会检查所有内容。但在新行中,我得到了 01/01/0001 的单元格

标签: wpf datagrid


【解决方案1】:

如果我错了,请纠正我。你用 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}}"

【讨论】:

  • 我不填,网格填……因为它不为空……它被设置为最小值……
  • 我知道你必须这样做。但是转换器呢?你试过了吗?它应该可以解决问题。
  • 将在几个小时内尝试并报告
  • @Ashi:不完全是,虽然我承认它们很相似。我想展示如何将转换器用作静态资源而不是代码隐藏。
  • @NielW:你是对的。感谢您参与您的想法。我不知道这里的情况如何。我最近才在这里活动。
【解决方案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}}"/>

【讨论】:

  • 如果您真的关心第 1 年的日期,这种方法就行不通。:-)
猜你喜欢
  • 2012-06-24
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多