2014-12-23 12 views
9

W tym DatePicker gdybym wpisać błędną datę takich jak
1/1/20001 (enter)
otrzymuję następujący wyjątekDatePicker System.FormatException

Pierwsza szansa wyjątek typu ' System.FormatException 'wystąpił w mscorlib.dll

Dodatkowe informacje: Ciąg nie został rozpoznany jako poprawny obiekt DateTime.

Wygląda na to, że jest wyrzucany przez wiązanie i nie mogę znaleźć sposobu, aby sobie z tym poradzić.
W debug uzyskać powyższe na ekranie

włączony ślad stosu i mówi, że błąd jest generowany na SearchItem.Date1 dostać
Ale problemem jest to, że nie jest get rzeczywiście nazywa się w tej sytuacji

Jeśli wprowadzę poprawną datę, taką jak 1/1/2000, zobaczę oba zestawy i otrzymam wywołanie.

Po wprowadzeniu i niepoprawnej dacie nie ma połączenia z ustawieniem.

Po wprowadzeniu i niepoprawnej dacie i naciśnięciu klawisza Enter lub utracona fokus wraca do wcześniejszej daty i nie zgłasza wyjątku. Jeśli poprzednia data była pusta, wraca do wartości null.

Jeśli jest to dla mnie poważny problem, to jeśli użytkownik wprowadzi poprawną datę , a następnie wprowadzi nieprawidłową datę, DatePicker właśnie powróci do ostatniej prawidłowej daty. Użytkownik nie wie, że data się nie zmieniła.

Pytanie brzmi, w jaki sposób mogę obsłużyć niepoprawny wyjątek daty?

<DatePicker Width="140" DisplayDateStart="1/1/1990" DisplayDateEnd="12/31/2020" 
      SelectedDate="{Binding Path=Date1, Mode=TwoWay, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"/> 

Gdybym wyjąć

, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged 

nic się nie zmieni

private DateTime? date1; 
public DateTime? Date1 
{ 
    get 
    { 
     try 
     { 
      return date1; 
     } 
     catch (Exception ex) 
     { 
      return (DateTime?)null; 
      throw; 
     } 
    } 
    set 
    { 
     if (date1 != value) 
     { 
      date1 = value; 
      NotifyPropertyChanged("Date1");  
     } 
    } 
} 
+0

Czy to 'DatePicker',' System.Windows.Controls.DatePicker'? ponieważ jeśli tak, to żaden wyjątek nie został zgłoszony, gdy uruchomiłem twój kod. –

+0

@Bahman_Aries nie jest wyjątkiem dla mnie. Muszę złapać nieprawidłową datę. – Paparazzi

Odpowiedz

8

Jednym sposobem mogę myśleć jest użycie DateValidationError zdarzenie:

XAML:

<DatePicker Width="140" DisplayDateStart="1/1/1990" DisplayDateEnd="12/31/2020" 
      SelectedDate="{Binding Path=Date1, Mode=TwoWay, 
      ValidatesOnExceptions=True, ValidatesOnDataErrors=True, 
      UpdateSourceTrigger=PropertyChanged}" 
      DateValidationError="DatePicker_DateValidationError" /> 

Kod za:

private void DatePicker_DateValidationError(object sender, DatePickerDateValidationErrorEventArgs e) 
{ 
    // throw FormatException 
    e.ThrowException = true; 

    //OR 

    // handle the exception by showing message and clearing data 
    MessageBox.Show(e.Exception.Message); 
    ((DatePicker)sender).Text = null; 
} 
+0

Jak dotąd to wygląda dobrze. Pozwól mi zrobić więcej testów. I dzięki. – Paparazzi