You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制WPF视图调用INotifyDataErrorInfo的GetErrors()方法?

解决WPF中INotifyDataErrorInfo验证后错误信息残留的问题

你的核心问题是调用RaiseErrorChanged(string.Empty)无法触发绑定引擎重新调用GetErrors(),导致界面错误提示不更新。以下是直接可行的解决方案:

方案1:针对具体属性触发ErrorsChanged事件

WPF绑定引擎对空字符串的ErrorsChanged通知响应有限,不会主动为单个控件重新查询错误。修改ClearAllErrors方法,遍历所有需要验证的属性(或之前存在错误的属性)逐个触发事件:

public void ClearAllErrors()
{
    // 先保存之前有错误的属性,避免清除后丢失列表
    var erroredProperties = new List<string>(_formGreske.Keys);
    _formGreske.Clear();
    
    // 为每个曾出错的属性单独触发错误变更通知
    foreach (var prop in erroredProperties)
    {
        RaiseErrorChanged(prop);
    }
    
    // 可选:触发全局错误状态更新
    RaiseErrorChanged(string.Empty);
}

如果不确定哪些属性可能出错,也可以直接列出所有需要验证的属性(比如nameof(BrojTransakcije))来遍历触发。

方案2:在验证通过时主动触发对应属性的通知

在IsFormValid方法中,当属性验证通过时,主动触发该属性的ErrorsChanged事件,确保绑定引擎获取最新的无错误状态:

public bool IsFormValid()
{
    bool valid = true;
    _errorHandler.ClearAllErrors();
    
    if (BrojTransakcije == null || BrojTransakcije.Length < 4)
    {
        _errorHandler.AddError(nameof(BrojTransakcije), "Invalid chars");
        valid = false;
    }
    else
    {
        // 验证通过时,强制通知绑定引擎重新查询该属性的错误
        RaiseErrorChanged(nameof(BrojTransakcije));
    }
    
    return valid;
}

关键原理

WPF绑定引擎仅在接收到具体属性名的ErrorsChanged事件时,才会主动调用该属性的GetErrors()方法更新界面错误提示。传递空字符串的通知只会更新全局的错误状态(如HasErrors属性),不会触发单个控件的错误重查。

另外,确保你的GetErrors实现正确,当属性无错误时返回空枚举:

public IEnumerable GetErrors(string propertyName)
{
    if (string.IsNullOrEmpty(propertyName) || !_formGreske.ContainsKey(propertyName))
        return Enumerable.Empty<string>();
    return _formGreske[propertyName];
}

内容的提问来源于stack exchange,提问作者redTomato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:20:40