Domanda

Nella mia classe sto implementando INotifyDataErrorInfo E funziona bene quando si verifica un errore di convalida. Sta mettendo quella cornice rossa attorno alla casella di testo, ma non si libera quando l'errore di convalida è corretto.

Ecco il mio codice:

    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; }
    }

Sto chiamando il metodo removeError () per rimuovere gli errori. Sto facendo qualcosa di sbagliato? Quando la validazione è stata fissata, devo andare a TextBox e la tavola di esserne cura. Voglio rimuovere subito quel frame rosso quando l'errore di convalida è sparito.

AGGIORNARE:

Quando digio qualcosa su casella di testo, devo inviare tali informazioni al server in modo asincrono e la risposta mi porterà un messaggio in caso di problemi di convalida. Quindi non posso fare le cose di convalida sulla proprietà cambiate. Controllerò la risposta se c'è qualche messaggio aggiunto o rimosso. Se si è rimosso, chiamerò CheckValidationErrors ().

RISPONDERE

Stavo implementando IDataErrorInfo e poi ha deciso di implementare INotifyDataErrorInfo. Stavo pensando di rendere questo lavoro di convalida di cui ho bisogno per implementare entrambe le interfacce. Quindi in pratica ho rimosso IDataErrorInfo Implementazione dalla mia classe e questo ha risolto il problema.

Grazie per l'aiuto!

È stato utile?

Soluzione 2

Stavo implementando IDataErrorInfo e poi ha deciso di implementare INotifyDataErrorInfo. Stavo pensando di rendere questo lavoro di convalida di cui ho bisogno per implementare entrambe le interfacce. Quindi in pratica ho rimosso IDataErrorInfo Implementazione dalla mia classe e questo ha risolto il problema.

Altri suggerimenti

Valore predefinito di UpdateSourceTrigger per TextBox è LostFocus.

Dovresti cambiarlo in PropertyChanged Se si desidera eseguire subito la logica di convalida una volta corretto l'errore.

<TextBox Text="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged}"/>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top