我的窗口上有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
。如果用户清除任何其他日期都按预期工作,则只有具有今日日期的方案失败。
这个日期选择器问题还是我错过了什么?
答案 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
失去焦点时都会更新属性。