在WPF应用程序中绑定可为空的日期时间

时间:2015-02-17 12:12:47

标签: c# .net wpf datetime binding

我有一个wpf应用程序,我将此属性绑定到 datepicker

public Nullable<System.DateTime> dpc_date_engagement { get; set; }

所以我添加了一个转换器:

 public class DateConverter : IValueConverter
   {
       public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
            return ((DateTime)value).ToShortDateString();
        return String.Empty;
    }

       public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
       {
           string strValue = value.ToString();
           DateTime resultDateTime;
           return DateTime.TryParse(strValue, out resultDateTime) ? resultDateTime : value;
       }
   }

在XAML文件中:

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

问题是当日期为空时,显示的文本为1/1/0001。

  • 如何修复我的代码以显示空字符串而不是01/01/0001,以获取空值?

2 个答案:

答案 0 :(得分:5)

传递给你的转换器的Nullable value本身不是null,即使它拥有null值(它甚至不能为null,因为它是一个结构体因此不可空。)

因此,您不必将valuenull进行比较,而是必须将其转换为Nullable<Datetime>,然后检查其HasValue属性。

此外,您似乎在绑定属性中使用DateTime.MinValue而不是null。所以你也应该检查一下:

public object Convert(...)
{
    var nullable = (Nullable<DateTime>)value;

    if (nullable.HasValue && nullable.Value > DateTime.MinValue)
    {
        return nullable.Value.ToShortDateString();
    }

    return String.Empty;
}

答案 1 :(得分:1)

我发现在 DatePicker 中使用 nullable DateTime 字段的最简单方法是设置 TargetNullValue =''

在XAML文件中:

<DatePicker Text={Binding dpc_date_engagement, Mode=TwoWay, TargetNullValue='', UpdateSourceTrigger=PropertyChanged} />