Я очень просто проверил, есть ли где-нибудь в моем окне ошибка проверки (при условии, что для всех привязок будет установлено NotifyOnValidationError
):
public MainWindow()
{
InitializeComponent();
DataContext = new VM();
AddHandler(Validation.ErrorEvent, new RoutedEventHandler((s, e) =>
{
var args = (ValidationErrorEventArgs)e;
var binding = (BindingExpression)args.Error.BindingInError;
Title = binding.HasError ? $"Error {args.Error.ErrorContent}" : "";
}), true);
}
Событие возникает, когда ошибки появляются / исчезают,но по некоторым причинам HasError
все еще true
, когда больше нет ошибок и ErrorContent
содержит старый текст ошибки.
Что я делаю не так?
Ниже приведенпростой MCVE с проверкой, что Test
должно быть 0
.
Ошибки привязки (ввод 0a
или пустая строка) устанавливаются / сбрасываются правильно. Ошибка валидации установлена правильно (при вводе 1
), но не сбрасывается (при вводе 0
). Почему?
Реализация INotifyPropertyChange
не имеет значения.
xaml:
<TextBox Text="{Binding Test, NotifyOnValidationError=True, UpdateSourceTrigger=PropertyChanged}" />
Просмотреть модель:
public class VM : INotifyDataErrorInfo
{
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
int _test;
public int Test
{
get => _test;
set
{
_test = value;
_error = value == 0 ? null : "Must be 0";
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(nameof(Test)));
}
}
string _error;
public bool HasErrors => _error != null;
public IEnumerable GetErrors(string propertyName)
{
if (_error != null)
yield return _error;
}
}