类
TabItemEx
继承自TabItem
,并有一个额外的int属性来记录从其下的Controls引发的Validation Errors
的数量。
internal class TabItemEx : TabItem, INotifyPropertyChanged
{
private int _NumErrors;
public int NumErrors
{
get => _NumErrors;
set
{
if (_NumErrors != value)
{
_NumErrors = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(NumErrors)));
}
}
}
public TabItemEx() : base()
{
NumErrors = 0;
Debug.WriteLine("TabItemEx Created");
}
public event PropertyChangedEventHandler PropertyChanged;
}
每次触发
Validation.Error
路由事件时都会更新验证错误计数。
private void CollectError(object sender, ValidationErrorEventArgs e)
{
var tabItemEx= sender as TabItemEx;
if (tabItemEx == null) return;
if (e.Action == ValidationErrorEventAction.Added)
{
tabItemEx.NumErrors++;
Debug.WriteLine($"{tabItemEx.Header.ToString()}:+:{tabItemEx.NumErrors} {e.Error.ErrorContent.ToString()}");
}
else
{
tabItemEx.NumErrors--;
Debug.WriteLine($"{tabItemEx.Header.ToString()}:-:{tabItemEx.NumErrors} {e.Error.ErrorContent.ToString()}");
}
if (tabItemEx.NumErrors == 0)
{
tabItemEx.Foreground = Brushes.Black;
}
else
{
tabItemEx.Foreground = Brushes.Red;
}
在加载初始状态下没有任何验证错误的实例时,此方法工作正常。 (要重现,请在启动后单击
Normal
按钮)。验证规则是:所有三个 int 属性 A、B、C 都应大于零。
奇怪的是,当应用程序设置后立即加载初始 A 值不正确的实例时,收集的验证错误数量变为零。
在这种状态下,将 A 从 -2 更改为 2 将产生无意义的负计数。
这是一个可立即运行的最小 VS 项目,用于快速复制。 谁能解释为什么会发生这些?更重要的是,在加载具有初始验证错误的实例时如何获取正确的错误号?
第一次执行的顺序是:
TabItem Created
->TabItem ContentChanged
->Validation in ViewModel Class
->TabItem ApplyTemplate
->TabItem Loaded
。
没有触发 Validation.Error 事件。