Ho riscontrato un problema con le convalide tra più campi. Ad esempio, ho ottenuto un ViewModel denominato RangeDateViewModel che contiene 2 istanze di una classe denominata DateViewModel, ognuna delle quali rappresenta rispettivamente una data di inizio e una data di fine.Convalida tra più campi in diversi livelli
Quindi il mio aspetto di legame come questo -
<TextBox Text="{Binding StartDate.Date, ValidateOnDataError=True}">
<TextBox Text="{Binding EndDate.Date, ValidateOnDataError=True}">
La mia classe RangeDateViewModel implementa l'interfaccia IDataErrorInfo. Nel mio piano, il RangeDateViewModel sarebbe verificare che la data di inizio è precedente alla data di fine, applicando la logica di convalida nel IDataErrorInfo [ "propertyName"] funzione come questa -
public string this[string columnName]
{
get
{
return ValidationError();
}
}
Il problema è che questo non è mai chiamato, e invece vengono chiamate le proprietà IDataErrorInfo che risiedono in ciascuna classe DateViewModel.
Suppongo che ciò avvenga perché la proprietà associata non è nello stesso livello di RangeDateViewModel, ma all'interno del figlio DateViewModel.
Penso che il mio bisogno sia piuttosto semplice e che ci sia una soluzione facile per questo problema. Ho provato a utilizzare ValidationRules invece di IDataErrorInfo, ma poi avrei problemi a far conoscere al ViewModel lo stato di convalida corrente da ValidationRules.
Grazie Daniel! Ho provato quello che avevi suggerito ma a quanto pare non è ancora abbastanza buono. La proprietà IDataErrorInfo è infatti l'accesso, ma solo all'inizializzazione del modello e non più tardi quando i dati effettivi vengono modificati. Immagino che questo sia dovuto al fatto che StartDate e EndDate sono oggetti complessi che loro stessi non sono stati modificati, ma proprietà al loro interno, e questo non è sufficiente per aumentare il PropertyChanged. Forse dovrei in qualche modo aumentare un evento quando cambiano le proprietà della data interna? – Dror
@Dror: hai ragione. Vedi il terzo passaggio nella risposta aggiornata. –
Grazie ancora Daniel! Questo ha funzionato anche se ho ancora un ultimo problema minore che sto affrontando. Con questa soluzione il risultato sono i due controlli contrassegnati in rosso quando il valore non è valido. Mi piacerebbe che invece di essere marcati in rosso, lo Stackpanel che contiene questi due campi sarà segnato in lettura. Preferibilmente questi due campi non saranno contrassegnati, ma non è obbligatorio. Ho provato ad applicare un DataTrigger su una proprietà bool su RangeDateViewModel denominata "HasErrors" che imposterà "Validation.HasError" su true, ma sfortunatamente è una proprietà di sola lettura. Spero che tu mi possa aiutare anche con questo problema. – Dror