我非常简单地检查窗口中是否存在验证错误(假设所有绑定都将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;
}
}
如果Title
从处理程序中设置from,我认为您需要考虑ValidationErrorEventArgs.Action属性:
获取一个值,该值指示错误是新错误还是已被清除的现有错误。
我不确定100%,但是我怀疑,当您检查该HasError
物业时,尚未清除该物业。(从MSDN怀疑(基于“还应注意,在任一方向(目标到源或源到目标)上的有效值传输都会清除Validation.Errorsattached属性。”)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句