web-dev-qa-db-fra.com

Quelle est la différence entre ValidatesOnNotifyDataErrors et ValidatesOnDataErrors et NotifyOnValidationError dans la validation WPF?

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?

46
kuhajeyan

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.

51
Ibrahim Najjar

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é.

2
thomasgalliker