Pregunta

En mi clase estoy implementando INotifyDataErrorInfo Y está funcionando bien cuando ocurre el error de validación. Está colocando ese marco rojo alrededor del cuadro de texto, pero no se está deshaciendo de él cuando se soluciona el error de validación.

Aquí está mi código:

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

Estoy llamando al método removeRor () para eliminar los errores. ¿Estoy haciendo algo mal? Cuando se solucione la validación, necesito ir a TextBox y Tabbing de ello se encargará de ello. Quiero eliminar ese marco rojo de inmediato cuando desaparezca el error de validación.

ACTUALIZAR:

Cuando escribo algo en el cuadro de texto, necesito enviar esa información al servidor de forma asincrónica y la respuesta me traerá un mensaje si hay algún problema de validación. Así que no puedo hacer cosas de validación en la propiedad cambiada. Verificaré la respuesta si hay algún mensaje agregado o eliminado. Si alguno se elimina, llamaré checkValidationErrors ().

RESPONDER

Estaba implementando IDataErrorInfo y luego decidió implementar INotifyDataErrorInfo. Estaba pensando en hacer que esta validación funcione, necesito implementar ambas interfaces. Así que básicamente quité IDataErrorInfo Implementación de mi clase y eso solucionó el problema.

¡Gracias por la ayuda!

¿Fue útil?

Solución 2

Estaba implementando IDataErrorInfo y luego decidió implementar INotifyDataErrorInfo. Estaba pensando en hacer que esta validación funcione, necesito implementar ambas interfaces. Así que básicamente quité IDataErrorInfo Implementación de mi clase y eso solucionó el problema.

Otros consejos

Valor predeterminado de UpdateSourceTrigger por TextBox es LostFocus.

Deberías cambiarlo a PropertyChanged Si desea ejecutar su lógica de validación de inmediato una vez que se corrija el error.

<TextBox Text="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged}"/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top