如何强制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
相关产品推荐
相关产品推荐

