奇怪的 WPF 数据验证行为

问题描述 投票:0回答:1

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 值不正确的实例时,收集的验证错误数量变为零。 Abnormal zero errors

在这种状态下,将 A 从 -2 更改为 2 将产生无意义的负计数。 negative counts

这是一个可立即运行的最小 VS 项目,用于快速复制。 谁能解释为什么会发生这些?更重要的是,在加载具有初始验证错误的实例时如何获取正确的错误号?

c# .net wpf
1个回答
0
投票

第一次执行的顺序是:

TabItem Created
->
TabItem ContentChanged
->
Validation in ViewModel Class
->
TabItem ApplyTemplate
->
TabItem Loaded
。 没有触发 Validation.Error 事件。

© www.soinside.com 2019 - 2024. All rights reserved.