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

标签 c# wpf validation data-binding xaml

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

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

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

最佳答案

我不认为你可以使用 (Validation.Errors) 绑定(bind)来做这样的事情。原因是验证附加属性在绑定(bind)控件和装饰器站点之间提供了一对一关系,因此您不能将来自不同控件的验证错误组合在一个装饰器中 - 最后一个总是“接管”网站。顺便说一句,我不知道为什么 Validation.Errors 是一个数组——可能是来自同一控件的多个错误?

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

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

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

并将一些 ItemsControl 绑定(bind)到 CombinedErrors 属性

第二个将涉及在每个绑定(bind)上设置 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);
}

然后您可以将这些类似地绑定(bind)到任何 ItemsControl。

关于c# - 在单个 WPF 控件中列出所有 Validation.Errors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1615631/

相关文章:

php - 多少限制太多?

c# - 使用为 SqlDataReader 中的每一行调用委托(delegate)的方法有什么缺点?

c# - 同时播放两个声音c#

c# - 添加到表单的控件没有名称

mysql - 尽管异步调用,ADO .NET 仍然阻塞

php - 如何创建一个没有选定选项的多选框codeigniter

validation - MVC3 客户端验证不起作用

c# - 使用 Fluent API 编写一对一关系

c# - 具有精确表达式的起订量<Func<TEntity, bool>>

wpf - 将元素焦点与附加属性绑定(bind)?