DateTimePicker + WPF + binding + accetta gg / MM / aaaa tramite userinput

Domanda semplificata:

Ho un DatePicker in WPF. Inserisco un valore 30/10/1983 nella casella di testo del datepicker. Ho bisogno che il valore venga posticipato al mio viewmodel, dove l’ho associato a un DateTime? proprietà.

C’è un modo per raggiungerlo. Il formato mm / gg / aaaa triggers un postback ma non gg / mm / aaaa.

Il codice DatePicker è il seguente.

  

La proprietà del modello di vista è la seguente.

 private DateTime? birthDate; public DateTime? BirthDate { get { return this.birthDate; } set { this.birthDate = value; OnPropertyChanged("BirthDate"); } } 

Inserisco un valore 10/10 nella casella di testo datepicker, il setter viene chiamato con un valore, ma nel momento in cui inserisco un’intera data 30/10/1983, ho ancora la proprietà del modello di visualizzazione che è uguale a NULL.

Ho cambiato il formato in inglese-UnitedKingdom, nelle impostazioni del calendario, e il mio CurrentCulture riflette en-GB in modo appropriato.

Domanda originale:

Ho un controllo datimepicker in WPF, che ho associato la proprietà text a un DateTime Nullable nel modello di visualizzazione.

Il problema che sto affrontando è quando inserisco un valore nel formato MM / gg / aaaa, ottengo un valore di postback nel modello di vista, che indica il nuovo valore.

Ma quando inserisco il valore nel formato gg / MM / aaaa, non ricevo una notifica nel modello di visualizzazione e il valore è perso. La proprietà associata nel modello di vista è null.

Il formato di data breve è quello che ho specificato nelle impostazioni del calendario e dataFormato, all’interno del quale per un formato di data breve fornisco la voce come “gg / MM / aaaa”.

Qualcuno potrebbe aiutarmi con questo scenario in cui accetto la data nel formato gg / MM / aaaa, e non voglio hardcode, desidero prendere il formato della data breve dalle impostazioni del calendario e, inoltre, desidero ricevere il valore aggiornato anche nel modello di vista.

Il problema è relativo al fatto che una data non valida non verrà impostata con un valore corretto della proprietà ViewModel DateTime. Quindi, puoi intercettarlo e convertirlo correttamente con un CONVERTITORE.

Un esempio:

 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { string strValue = System.Convert.ToString(value); DateTime resultDateTime; if (DateTime.TryParse(strValue, out resultDateTime)) { return resultDateTime; } return value; } 

E il tuo codice XAML sarà come: