我的viewmodel类中有一个DateTime属性(比如说,DateVal),View中有一个DatePicker控件。
<DatePicker Grid.Column="1"
Width="100"
Height="30"
SelectedDate="{Binding DateVal,ValidatesOnDataErrors=True}"/>
问题是,如果用户删除Datepicker控件的文本框中显示的日期,则DateVal属性不会更改其值。如何跟踪用户是否已删除datepicker文本框中显示的日期? 问候, Anirban
日期选择器控件如下所示 现在,如果用户只删除日期选择器文本框中显示的日期,则控件如下所示 在那个时间点,DateVal的值与之前相同。 仅当用户单击日历图标时,才会为Date分配值null。 当用户将文本框设为空时,如何跟踪更改?
ViewModel代码
public DateTime? DateVal
{
get
{
return this.dateVal;
}
set
{
this.dateVal = value;
this.OnPropertyChanged("DateVal");
}
}
xaml代码
<DatePicker Name="datePickerDateVal"
Grid.Column="1"
Width="100"
Height="30"
SelectedDate="{Binding DateVal,ValidatesOnDataErrors=True}"
Text="{Binding DateVal,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}" />
我希望当用户清除日期选择器文本框时必须调用DateVal的setter属性
答案 0 :(得分:2)
令人遗憾的是,DatePicker的文本框设置为在失去焦点时更新其绑定源 。好消息是,您可以通过DatePicker
的{{1}} {<1}}进入流程:
XAML:
ControlTemplate
守则背后:
<DatePicker SelectedDate="{Binding DateVal}" x:Name="__picker" />
我只是摆弄它,我的猜测是你没有得到更频繁更新的原因是文本和所选日期属性之间的循环关系。确保我们获得null DateTimes的更新应该没问题。
修改强>
更新了事件处理程序以更新选择器DateTime? _dateVal = DateTime.Today;
public Nullable<DateTime> DateVal
{
get { return _dateVal; }
set
{
if (_dateVal == value)
return;
_dateVal = value;
OnPropertyChanged("DateVal");
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DatePickerTextBox pickerTextBox = __picker.Template.FindName("PART_TextBox", __picker) as DatePickerTextBox;
if (pickerTextBox == null)
return;
pickerTextBox.TextChanged += new TextChangedEventHandler(pickerTextBox_TextChanged);
}
void pickerTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
DatePickerTextBox tb = sender as DatePickerTextBox;
if (tb == null)
return;
if (string.IsNullOrEmpty(tb.Text))
{
__picker.SelectedDate = null;
}
}
属性,而不是视图模型中的属性。这样,您可以将hack完全保留在视图中,同时保持viewmodel不可知。