используя INotifyDataErrorInfo

В моем классе я реализую INotifyDataErrorInfo, и он отлично работает, когда возникает ошибка проверки. Он помещает эту красную рамку вокруг TextBox, но не избавляется от нее, когда ошибка проверки исправлена.

Вот мой код:

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

Я вызываю метод RemoveError() для удаления ошибок. Я делаю что-то неправильно? Когда проверка исправлена, мне нужно перейти в TextBox, и об этом позаботится вкладка. Я хочу сразу удалить эту красную рамку, когда ошибка проверки исчезнет.

ОБНОВЛЕНИЕ:

Когда я набираю что-то в текстовое поле, мне нужно отправить эту информацию на сервер асинхронно, и ответ принесет мне сообщение, если возникнут какие-либо проблемы с проверкой. Поэтому я не могу выполнять проверку свойств, измененных. Я проверю ответ, если какое-либо сообщение добавлено или удалено. Если что-то удалено, я вызову CheckValidationErrors().

ОТВЕТ

Я реализовывал IDataErrorInfo, а потом решил реализовать INotifyDataErrorInfo. Я думал, чтобы эта проверка работала, мне нужно реализовать оба интерфейса. В общем, я удалил реализацию IDataErrorInfo из своего класса, и это решило проблему.

Спасибо за помощь!


person Dilshod    schedule 07.11.2013    source источник
comment
Дилшод, пожалуйста, добавьте свой ответ в ответ и отметьте его как принятый, чтобы этот вопрос можно было пометить как отвеченный.   -  person Sheridan    schedule 19.07.2014


Ответы (2)


Значение по умолчанию UpdateSourceTrigger для TextBox равно LostFocus.

Вы должны изменить его на PropertyChanged, если хотите запустить логику проверки сразу после исправления ошибки.

<TextBox Text="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged}"/>
person Rohit Vats    schedule 07.11.2013
comment
Допустим, я набрал Test и не сразу получаю сообщение об ошибке. Он отправляет данные на сервер асинхронно и возвращает сообщение, если есть ошибка проверки. И я вызываю ручную проверку ошибок проверки. Итак, теперь, когда я набираю действительный текст в textBox, он также отправляет его на сервер асинхронно. сервер удаляет сообщение. После этого я проверяю ошибку проверки. - person Dilshod; 07.11.2013

Я реализовывал IDataErrorInfo, а потом решил реализовать INotifyDataErrorInfo. Я думал, чтобы эта проверка работала, мне нужно реализовать оба интерфейса. Так что в основном я удалил реализацию IDataErrorInfo из своего класса, и это решило проблему.

person Dilshod    schedule 19.07.2014