Dans validation WPF, quelle est la différence entre les éléments suivants:
ValidatesOnNotifyDataErrors = True
ValidatesOnDataErrors = True
NotifyOnValidationError = True
Quand devez-vous utiliser ces propriétés correctement en XAML?
ValidatesOnNotifyDataErrors
et ValidatesOnDataErrors
sont utilisés lorsque vous souhaitez qu'un contrôle lié XAML valide son entrée en fonction d'une interface implémentée dans ViewModel/Model, pour ValidatesOnNotifyDataErrors
cette interface est INotifyDataErrorInfo
et pour ValidatesOnDataErrors
c'est IDataErrorInfo
.
par exemple, supposons que vous ayez un modèle de vue comme celui-ci:
class PersonViewModel : IDataErrorInfo {
public string FirstName {get; set;}
string IDataErrorInfo.Error
{
return string.Empty;
}
string IDataErrorInfo.this[string columnName] {
if (columnName == "FirstName" &&) {
if (this.FirstName.Length > 20)
return "FirstName can't be more than 20 characters.";
}
return string.Empty;
}
}
puis dans votre vue, vous avez une zone de texte qui est liée à la propriété FirstName comme ceci: <TextBox Text={Binding Path=FirstName, ValidatesOnDataErrors=True} />
maintenant si l'utilisateur a entré 20 caractères ou plus dans la zone de texte, une erreur sera détectée.
D'autre part, NotifyOnValidationError
est utilisé lorsque vous souhaitez qu'un événement soit déclenché lorsque la validation échoue.
J'utilise généralement ValidatesOnDataErrors
dans mes contrôles XAML pour la validation et je n'ai pas eu besoin des deux autres, cela dépend donc de votre situation.
EDIT: Je mets à jour ma réponse car j'ai appris de nouvelles choses, je dois donc rendre cela plus pertinent.
ValidatesOnDataErrors
est utilisé dans les clients lourds, ou en d'autres termes lorsque la validation est effectuée côté client, comme une application WPF ou WinForm de bureau et les objets de modèle implémentent IDataErrorInfo
.
D'un autre côté, ValidatesOnNotifyDataErrors
conviendrait mieux aux clients légers (applications à plusieurs niveaux) comme les applications client-serveur (Silverlight, WPF avec WCF , etc.) où la validation a lieu sur le serveur.
De cette façon, lorsque l'utilisateur tape quelque chose par exemple dans un TextBox, la valeur est envoyée au serveur de manière asynchrone pour validation, et lorsque les résultats de la validation reviennent, un événement est déclenché ( ErrorsChanged événement à être exact), puis la vue le prend et l'affiche en utilisant la méthode appropriée, bien sûr dans ce cas le modèle implémenterait INotifyDataErrorInfo
.
Juste pour votre information: IDataErrorInfo.Error n'est pas utilisé dans WPF et peut retourner null ou lever une NotImplementedException. Cette propriété a été utilisée dans WinForms.
Personnellement, je préfère utiliser INotifyDataErrorInfo car cela permet d'avoir plusieurs messages d'erreur mappés sur une seule propriété.