用户清除日期时,WPF Datepicker文本不会根据绑定进行更改

时间:2017-04-21 10:11:58

标签: c# wpf xaml mvvm datepicker

我的窗口上有datepicker,想要实现简单的行为:当用户清除datepicker的文本时将datepicker日期设置为今天

XAML:

<DatePicker SelectedDate="{Binding DateFrom}" Width="150" Margin="0,20,0,0"></DatePicker>

ViewModel DateFrom属性:

public DateTime? DateFrom
{
  get { return dateFrom; }
  set
  {
    if (dateFrom == value) return;
    dateFrom = value ?? DateTime.Today;
    OnPropertyChanged();
   }
}

但是如果用户从datepicker清除今天的日期,我会遇到奇怪的行为 - 在UI上,datepicker保持为空,但在ViewModel中我有DateFrom == DateTime.Today。如果用户清除任何其他日期都按预期工作,则只有具有今日日期的方案失败。

这个日期选择器问题还是我错过了什么?

2 个答案:

答案 0 :(得分:1)

在内部,它会检查上一个和当前值,并且只有在它们不同时才会引发属性更改。如果你深入研究DatePicker中的pickerAutomationPeer.RaiseValuePropertyChangedEvent(oldValue, newValue);代码,我认为它是OnSelectedDateChanged

避免这种情况的最简单方法是使用DateTime.Now代替DateTime.Today使值始终不同。

答案 1 :(得分:1)

这应该可以解决问题。

<DatePicker SelectedDate="{Binding DateFrom, UpdateSourceTrigger=LostFocus}"
  Width="150" Margin="0,20,0,0"></DatePicker>

默认情况下,UpdateSourceTrigger的值为PropertyChanged。但是当你明白今天的日期时,房产并没有改变。

因此,您必须将UpdateSourceTrigger的值更改为LostFocus。在这种情况下,每次DatePicker失去焦点时都会更新属性。