Как определить, нет ли ошибок в Validation.ErrorEvent? - PullRequest
3 голосов
/ 24 октября 2019

Я очень просто проверил, есть ли где-нибудь в моем окне ошибка проверки (при условии, что для всех привязок будет установлено 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;
    }

}

1 Ответ

1 голос
/ 24 октября 2019

Если вы установите Title из обработчика, я думаю, вам нужно учитывать свойство ValidationErrorEventArgs.Action :

Получает значение, указывающее, является ли ошибкаявляется новой ошибкой или существующей ошибкой, которая теперь была очищена.

Я не уверен на 100%, но я подозреваю, что к тому времени, когда вы проверяете свойство HasError, оно еще не былоочищено. (Подозрение на основе "Также обратите внимание, что при действительной передаче значения в любом направлении (от цели к источнику или от источника к цели) очищается свойство Validation.Errorsattached." из MSDN )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...