Question

J'utilise des règles de validation pour afficher des messages personnalisés et inotifyDataError pour les règles métier.

Cette partie de mon code:

public class ResponseValidation : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        int? response;
        bool noIllegalChars = TryParseStruct<int>(value.ToString(), out response);


        if (!noIllegalChars)
        {
            return new ValidationResult(false, "Input is not in a correct format.");
        }
        else
        {
            value = null;
            return new ValidationResult(true, null);
        }
    }

    ... 
}

La validation est pour un type de données nullable, je veux dire que la valeur peut être nul ou un entier, mais pas une entrée incorrecte comme "5b".

La question est de savoir quand elle produit cette erreur (NOILLEGALCHARS = TRUE), comment puis-je définir sur la propriété la valeur NULL?

EDIT: La raison que je fais cela est parce que, lorsque l'utilisateur a quitté la zone de texte vide (la valeur sera "") et techniquement, pour la propriété qui est une valeur nulle, mais il essaie de définir "" sur la propriété.

Était-ce utile?

La solution

Techniquement - Vous pouvez transmettre la valeur par référence:

public override ValidationResult Validate(ref object value, System.Globalization.CultureInfo cultureInfo)

Philosophiquement - Voulez-vous que votre règle de validation modifie la valeur, ou simplement informer que la valeur est mauvaise? Du point de vue d'un utilisateur, il pourrait être ennuyeux si j'essaie de saisir une certaine valeur et le système me dit qu'il n'est pas valable, mais ne me donne pas l'opportunité de corriger ça, seulement pour recommencer.

Si le code demande Pour la validation, veut définir la valeur sur Null, c'est votre choix:

int? result;
string input = "5b"

ValidationResult response = ResponseValidation().Validate(input, CultureInfo.CurrentCulture);
if (!response.IsValid) 
    result = null;
else
    result = int.Parse(input, CultureInfo.CurrentCulture);

Juste mes 2 cents ...

Autres conseils

Vous ne pouvez pas sauf si la valeur est une réf. Si vous essayez de séparer la logique, la décision de savoir si les données sont valides devraient être différentes de ce que vous voulez faire après cette décision, telles que l'effacement du champ de saisie.

Par exemple:

if (!rule.Validate(val, CultureInfo.CurrentCulture).IsValid)
{
    //Clear the field... whatever else you want to do
}

Les réponses précédentes ont mentionné passer la valeur dans la fonction Validate Byref - non seulement c'est sémantiquement incorrect comme ils le mentionnent, mais si vous créez un surcharge Validate Fonction qui fait cela, alors le sous-système de liaison ne l'appellera pas si vous déclarez la règle de validation dans le XAML. Bien sûr, cela peut être appelé par programmation, mais vous vous tournez dans le pied si vous commencez à créer des validationrules avec du code qui ne peut être atteint que de cette manière.

Une action plus appropriée à prendre consiste à utiliser un convertisseur sur le terrain qui renvoie un défaut int? Si une chaîne vide est transmise.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top