在单个WPF控件中列出所有Validation.Errors?

Mat*_*att 6 c# data-binding validation wpf xaml

我正在尝试找到一种绑定单个控件(例如TextBlock或ListBox)的简单方法,以列出WPF表单上的所有验证错误.我能找到的大多数源代码示例只是将控件绑定到(Validation.Errors)[0] .ErrorContent,它只显示一个验证错误.

我目前正在使用ValidationRule类,但我愿意使用IDataErrorInfo或构建自定义验证器.我只是不确定如何实现我期望的常见用例.

如何在WPF表单的一个控件中列出所有验证错误?

Ser*_*hov 4

我认为您不能使用 (Validation.Errors) 绑定执行类似的操作。原因是验证附加属性在绑定控件和装饰器站点之间提供了一对一的关系,因此您不能将来自不同控件的验证错误合并到一个装饰器中 - 最后一个总是“接管”站点。顺便说一句,我不知道为什么 Validation.Errors 是一个数组 - 也许来自同一控件的多个错误?

但仍然有希望 - 您至少有两种方法可以解决这个问题,而无需使用验证装饰器。

第一个很简单 - 如果您使用 IDataErrorInfo,您就有一些机制来检查对象的绑定值的有效性。然后你可以写一些类似的东西

public IEnumerable<string> CombinedErrors
{
    get { 
           if (FirstValError) yield return "First value error"; 
           if (SecondValError) yield return "Second value error"; 
        }
}
Run Code Online (Sandbox Code Playgroud)

并将一些 ItemsControl 绑定到 CombinedErrors 属性

第二个涉及在每个绑定上设置 NotifyOnValidationError=True (以引发 Validation.Error 路由事件)并在顶部容器上捕获此事件:

public List<ValidationError> MyErrors { get; private set; }

private void Window_Error(object sender, 
    System.Windows.Controls.ValidationErrorEventArgs e)
{
    if (e.Action == ValidationErrorEventAction.Added)
        MyErrors.Add(e.Error);
    else
        MyErrors.Remove(e.Error);
}
Run Code Online (Sandbox Code Playgroud)

然后您可以将它们类似地绑定到任何 ItemsControl。