我正在尝试找到一种绑定单个控件(例如TextBlock或ListBox)的简单方法,以列出WPF表单上的所有验证错误。我能找到的大多数源代码示例只是将控件绑定到(Validation.Errors)[0] .ErrorContent,它只显示一个验证错误。
我目前正在使用ValidationRule类,但我愿意使用IDataErrorInfo或构建自定义验证器。我只是不确定如何实现我期望的常见用例。
如何在WPF表单的一个控件中列出所有验证错误?
答案 0 :(得分:4)
我不认为你可以使用(Validation.Errors)绑定做这样的事情。原因是Validation附加属性在绑定控件和装配器网站之间提供一对一关系,因此您无法在一个装配器中组合来自不同控件的验证错误 - 最后一个将永远“接管“网站。顺便说一句,我不知道为什么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。
答案 1 :(得分:0)
最小径,
很可能通过在一些添加的行为的帮助下实现您自己的ValidationRule来实现此目的。
我们的想法是在您的代码隐藏/ ViewModel中管理您自己的ValidationResult列表,并将其传递给您希望从中提取错误的TextBox。再次,使用相同的集合,将其绑定到ListBox或TextBlock以检索错误。
我已经写了article关于如何创建自己的验证错误跟踪器,或者随意下载源代码并按原样使用它。
希望有所帮助。