Question

Sur ma classe, j'implémente INotifyDataErrorInfo Et cela fonctionne bien lorsque l'erreur de validation se produit. Il met ce cadre rouge autour de la zone de texte, mais il ne s'en débarrasser pas lorsque l'erreur de validation est corrigée.

Voici mon code:

    string IDataErrorInfo.this[string columnName]
    {
        get
        {
            string error = null;
            if (Context != null)
            {
                var messages = //GetMessages(); messages are validation errors
                if (messages.Count != 0)
                {
                    error = "This is critical error. Must be fixed";
                    AddError(columnName, "Some kind of error happend", false);
                }
                else
                {
                    RemoveError(columnName);
                }
            }
            return error;
        }
    }

    //I call this method to check for validation errors.
    public void CheckValidationErrors(string propertyName)
    {
        var error = this as IDataErrorInfo;
        string message = error[propertyName];

    }


    private Dictionary<String, List<String>> errors =
        new Dictionary<string, List<string>>();

    public void AddError(string propertyName, string error, bool isWarning)
    {
        if (!errors.ContainsKey(propertyName))
            errors[propertyName] = new List<string>();

        if (!errors[propertyName].Contains(error))
        {
            if (isWarning) errors[propertyName].Add(error);
            else errors[propertyName].Insert(0, error);
            RaiseErrorsChanged(propertyName);
        }
    }

    public void RemoveError(string propertyName, string error="")
    {
        if (error == "")
        {
            errors.Remove(propertyName);
            RaiseErrorsChanged(propertyName);
        }
        else
        {
            if (errors.ContainsKey(propertyName) &&
                errors[propertyName].Contains(error))
            {
                errors[propertyName].Remove(error);
                if (errors[propertyName].Count == 0) errors.Remove(propertyName);
                RaiseErrorsChanged(propertyName);
            }
        }
    }

    public void RaiseErrorsChanged(string propertyName)
    {
        if (ErrorsChanged != null)
            ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
    }


    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

    public System.Collections.IEnumerable GetErrors(string propertyName)
    {
        if (String.IsNullOrEmpty(propertyName) ||
            !errors.ContainsKey(propertyName)) return null;
        return errors[propertyName];
    }

    public bool HasErrors
    {
        get { return errors.Count > 0; }
    }

J'appelle la méthode devo-dirror () pour supprimer les erreurs. Est-ce que je fais quelque chose de mal? Lorsque la validation est corrigée, j'ai besoin d'aller dans la zone de texte et le tablage de l'entretien. Je veux supprimer ce cadre rouge immédiatement lorsque l'erreur de validation a disparu.

METTRE À JOUR:

Lorsque je tape quelque chose dans la zone de texte, je dois envoyer ces informations au serveur de manière asynchrone et la réponse me fera un message en cas de problèmes de validation. Je ne peux donc pas faire des choses de validation sur la propriété modifiée. Je vérifierai la réponse s'il y a un message ajouté ou supprimé. Si cela est supprimé, j'appellerai CheckValidyError ().

RÉPONSE

Je mettrais en œuvre IDataErrorInfo puis a décidé de mettre en œuvre INotifyDataErrorInfo. Je pensais faire ce travail de validation dont j'ai besoin pour implémenter les deux interfaces. Donc, fondamentalement, j'ai supprimé IDataErrorInfo implémentation de ma classe et cela a résolu le problème.

Merci pour l'aide!

Était-ce utile?

La solution 2

Je mettrais en œuvre IDataErrorInfo puis a décidé de mettre en œuvre INotifyDataErrorInfo. Je pensais faire ce travail de validation dont j'ai besoin pour implémenter les deux interfaces. Donc, fondamentalement, j'ai supprimé IDataErrorInfo implémentation de ma classe et cela a résolu le problème.

Autres conseils

Valeur par défaut de UpdateSourceTrigger pour TextBox est LostFocus.

Tu devrais le changer en PropertyChanged Si vous souhaitez exécuter votre logique de validation immédiatement une fois que l'erreur est corrigée.

<TextBox Text="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged}"/>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top