Я реализовал IDataErrorInfo
а затем решил внедрить INotifyDataErrorInfo
. Анкет Я думал сделать эту работу по проверке, мне нужно для реализации оба интерфейса. Так что в основном я удалил IDataErrorInfo
Реализация из моего класса и это исправило проблему.
Использование inotifydataerrorinfo
-
29-07-2022 - |
Вопрос
В своем классе я реализую 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, и позаботится об этом. Я хочу сразу удалить этот красный кадр, когда ошибка проверки исчезнет.
ОБНОВИТЬ:
Когда я набираю что -то в текстовое поле, мне нужно отправить эту информацию на сервер асинхронно, и ответ принесет мне сообщение, если возникнут проблемы с валидацией. Так что я не могу сделать проверку, изменившиеся на свойство. Я проверю на ответ, если есть какое -либо сообщение, добавленное или удалено. Если вы удалите, я позвоню в CheckValidationErrors ().
ОТВЕЧАТЬ
Я реализовал IDataErrorInfo
а затем решил внедрить INotifyDataErrorInfo
. Анкет Я думал сделать эту работу по проверке, мне нужно для реализации оба интерфейса. Так что в основном я удалил IDataErrorInfo
Реализация из моего класса и это исправило проблему.
Спасибо за помощь!
Решение 2
Другие советы
Значение по умолчанию UpdateSourceTrigger
за TextBox
является LostFocus
.
Вы должны изменить это на PropertyChanged
Если вы хотите сразу запустить свою логику проверки после исправления ошибки.
<TextBox Text="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged}"/>