2014-12-23 16 views
9

In questo DatePicker se digito una data non valida come
1/1/20001 (tasto Invio)
ottengo la seguente eccezioneDatePicker System.FormatException

Una prima eccezione di possibilità di tipo ' System.FormatException "si è verificato in mscorlib.dll

Ulteriori informazioni: String non è stato riconosciuto come DateTime valido.

Ma sembra che questo sia stato lanciato dall'associazione e non riesco a trovare un modo per gestirlo.
In di debug ho la precedenza sullo schermo

acceso traccia dello stack e dice l'errore viene gettato sul SearchItem.Date1 ottenere
Ma il problema è che ottiene non è in realtà chiamato in quella situazione

Se inserisco una data valida come 1/1/2000, vedo sia il set che il richiamo.

Se inserisco e data non valida non c'è nessuna chiamata da impostare.

Di I inserimento e data non valida e premere invio o perso lo stato attivo è appena tornato alla data precedente e non genera un'eccezione. Se la data precedente era nulla, torna a null.

Dove questo è un problema critico per me è se l'utente immette una data valida e quindi immette una data non valida che DatePicker ripristina semplicemente l'ultima data valida. Quindi l'utente non sa che la data non è cambiata.

La domanda è: come posso gestire un'eccezione di data non valida?

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

Se prendo

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

nulla cambia

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

E 'questo 'DatePicker',' System.Windows.Controls.DatePicker'? perché se lo è, nessuna eccezione generata quando ho eseguito il tuo codice. –

+0

@Bahman_Aries nessuna eccezione è la direzione sbagliata per me. Ho bisogno di prendere una data non valida. – Paparazzi

risposta

8

Un modo mi viene in mente è quello di utilizzare DateValidationError evento:

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

codice dietro:

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

Finora questo sembra buono. Lasciami fare qualche altro test. E grazie. – Paparazzi