在WPF应用程序内绑定可为null的日期时间

7uhlpewt  于 2023-01-21  发布在  其他
关注(0)|答案(3)|浏览(191)

我有一个wpf应用程序,其中我有这个属性绑定到日期选择器

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?
e5nqia27

e5nqia271#

我发现处理DatePicker中使用的nullable****DateTime字段的最简单方法是设置TargetNullValue=''
在XAML文件中:

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

l7mqbcuq2#

传递给转换器的可为空的value本身不是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;
}
koaltpgm

koaltpgm3#

对我来说,我实际上不得不将Mode=TwoWay属性添加到我的DatePicker中。现在它可以完美地处理可空日期:
NullableDateConverter.cs

public class NullableDateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is DateTime?))
            return string.Empty;

        var ndt = (DateTime?)value;
        if (ndt.HasValue)
            return ndt.Value.ToShortDateString();
        return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return DateTime.TryParse(value.ToString(), out var dateTime) ? dateTime : value;
    }
}

MainWindow.xaml

xmlns:conv="clr-namespace:Path.To.The.Converter.Folder"

...

<Window.Resources>
    <conv:NullableDateConverter x:Key="dateConverter"/>
</Window.Resources>

...

<DatePicker Text="{Binding SelectedDate, Mode=TwoWay, Converter={StaticResource dateConverter}}"/>

相关问题