2013-02-07 40 views
1

我在ViewModel類中有DateTime屬性(說DateVal),在View中有DatePicker控件。在viewmodel中驗證DateTime屬性

<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與之前相同。 只有當用戶點擊日曆圖標日期被分配一個值null。 如何在用戶使文本框變空的同時跟蹤更改?

視圖模型代碼

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}"       /> 

我想,當用戶清除日期選取器文本框中

回答

2

這個不幸的消息是DateVal的setter屬性必須被調用DatePicker的文本框設置爲只在丟失焦點時更新其綁定源。好十歲上下的消息是,你可以通過掛接到過程中的DatePickerControlTemplate

的XAML:

<DatePicker SelectedDate="{Binding DateVal}" x:Name="__picker" /> 

而後面的代碼:

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; 
    } 
} 

我只是擺弄它,我的猜測是,你沒有得到更頻繁更新的原因是文本和選定日期屬性之間的循環關係。確保我們得到空日期時間的更新應該是確定的。

編輯

更新了事件處理程序來更新採摘SelectedDate屬性,而不是在視圖模型中的財產。通過這種方式,您可以將視圖保留在視圖中,同時保持viewmodel不可知。

+0

試過,但它不起作用 –

+0

我編輯了我的問題。 –

+0

我實際上使用可爲空的DateTime屬性。它沒有幫助。 –