【问题标题】:Binding a nullable datetime within WPF application在 WPF 应用程序中绑定可为空的日期时间
【发布时间】:2015-04-18 03:07:57
【问题描述】:

我有一个 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,以显示空值?

【问题讨论】:

  • 转换器中的断点呢?
  • @YuriDorokhov 对于空值,它在方法转换中给我 value = 01/01/0001 00:00:00
  • 您是否尝试过设置一种样式,在值为 null 时将文本设置为“”?
  • 在值 x:null 上有一个数据触发器并将文本设置为 "".. 应该可以工作。不过我没试过。让我知道你是否实施
  • @LamloumiAfif 显然,您的 Nullable 不包含 null 值,而是 DateTime.MinValue(或默认构造的 DateTime)。如果它包含一个空值,则转换表达式(DateTime)value 将引发异常。

标签: c# .net wpf datetime binding


【解决方案1】:

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

在 XAML 文件中:

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

【讨论】:

  • 哇,这真的是最好的解决方案。我尝试通过转换文本绑定来绑定到 SelectedDate 几个小时。但总是遇到别人的问题。像这样将 DateTime 属性绑定到 Text 也解决了 Binding to SelectedDate 只在 LostFocus 上更新的问题。非常感谢
  • 我们可以在TargetNullValue 中设置文本吗?例如TargetNullValue="没有选择日期"?
【解决方案2】:

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

因此,您不必将valuenull 进行比较,而是将其转换为Nullable&lt;Datetime&gt;,然后检查其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;
}

【讨论】:

  • 对于空值 nullable = 01/01/0001 00:00:00 ,所以我有相同的结果
猜你喜欢
  • 1970-01-01
  • 2013-11-30
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 2023-03-26
相关资源
最近更新 更多