2013-11-07 4 views
0

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

Вот мой код:

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, и табуляция позаботится об этом. Я хочу удалить этот красный фрейм сразу, когда ошибка проверки исчезла.

UPDATE:

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

ОТВЕТ

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

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

+0

Dilshod, пожалуйста, добавьте свой ответ в ответ и отметьте его как принятый, чтобы этот вопрос мог быть отмечен как ответ. – Sheridan

ответ

2

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

1

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

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

<TextBox Text="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged}"/> 
+0

Допустим, я набрал «Тест», и я не сразу получил ошибку. Он отправляет данные на сервер асинхронно и возвращает сообщение, если есть ошибка проверки. И я вызываю вручную проверку на ошибки проверки. Итак, теперь, когда я печатаю корректный текст в текстовом поле, он также отправляет его на асинхронный сервер. сервер удаляет сообщение. После этого я проверяю ошибку проверки. – Dilshod

Смежные вопросы