验证viewmodel中的DateTime属性

时间:2013-02-07 11:43:58

标签: wpf validation data-binding mvvm datepicker

我的viewmodel类中有一个DateTime属性(比如说,DateVal),View中有一个DatePicker控件。

    <DatePicker         Grid.Column="1"
                        Width="100"
                        Height="30"
                        SelectedDate="{Binding DateVal,ValidatesOnDataErrors=True}"/>

问题是,如果用户删除Datepicker控件的文本框中显示的日期,则DateVal属性不会更改其值。如何跟踪用户是否已删除datepicker文本框中显示的日期? 问候, Anirban

日期选择器控件如下所示 Date picker before editing date picker text box 现在,如果用户只删除日期选择器文本框中显示的日期,则控件如下所示 Date picker after editing date picker text box 在那个时间点,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属性

1 个答案:

答案 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不可知。