【问题标题】:Listing all Validation.Errors in a single WPF control?在单个 WPF 控件中列出所有 Validation.Errors?
【发布时间】:2010-12-09 14:15:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# wpf validation data-binding xaml


    【解决方案1】:

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

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

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

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

    并将一些 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);
    }
    

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

    【讨论】:

    • 嘿嘿 :)。你是第一个,谢尔盖。另一种方法可能是自定义绑定转换器 (msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion)。
    • 谢谢谢尔盖!我选择了您建议的第二种方法,只需进行一些小的调整即可使其正常工作:使用 List 包含 ValidationError 对象几乎可以工作,但 ListView 控件不会自动更新。将它换成 ObservableCollection 或 BindingList 就可以了。湾。可能很明显,但我需要在 ListView 上使用 ItemTemplate 来显示 ValidationError 的 ErrorContent 属性。
    • 第二种解决方案其实很棒。在一个简单的应用程序中,您可能不想或不能(轻松地)实现 IDataErrorInfo。在任何地方,您都读到无法汇总所有 ValidationRules。使用这种技术,您可以。
    【解决方案2】:

    很可能通过在一些添加的行为的帮助下实现自己的 ValidationRule 来做到这一点。

    这个想法是在您的代码隐藏/ ViewModel 中管理您自己的 ValidationResult 列表,并将其传递到您希望从中提取错误的 TextBoxes 中。同样,使用相同的集合,将其绑定到您的 ListBox 或 TextBlock 以检索错误。

    我写了一封 article 来介绍如何创建自己的验证错误跟踪器,或者随意下载源代码并按原样使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      相关资源
      最近更新 更多