我有一个非常简单的检查,用于检测窗口中是否存在验证错误(假设所有绑定都设置了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;
}
}
binding.HasError
时,它尚未被清除。 - Fildor