如何正确实现INotifyDataErrorInfo?

时间:2013-04-08 08:23:15

标签: wpf inotifydataerrorinfo

我对MSDN example感到有些困惑。

目前尚不清楚如何处理和设置实体出现的错误。

示例中的代码:

public System.Collections.IEnumerable GetErrors(string propertyName)
{
    if (String.IsNullOrEmpty(propertyName) || 
        !errors.ContainsKey(propertyName)) return null;
    return errors[propertyName];
}

但GetErrors()的文档声明:

  

propertyName - 要检索验证错误的属性的名称   对于; 或null或Empty,以检索实体级错误

另一个例子表明只返回字典的_errors.Values。这只是所有属性错误,但同样不是实体错误。

2 个答案:

答案 0 :(得分:2)

根据文档中的“备注”部分:MSDN: INotifyDataErrorInfo Interface

  

此接口使数据实体类能够实现自定义   验证规则并异步公开验证结果。这个   接口还支持自定义错误对象,每个错误多个   属性,跨属性错误和实体级错误。   跨属性错误是影响多个属性的错误。您   可以将这些错误与一个或所有受影响的属性相关联,   或者您可以将它们视为实体级错误。实体级错误是   错误会影响多个属性或影响整个属性   实体,不影响特定财产。

我可能会建议GetErrors的实现高度依赖于您的错误处理方案。例如,如果您不打算支持Entity-Level错误,那么您的示例代码就足够了。但是,如果您确实需要支持Entity-Level错误,那么您可以单独处理IsNullOrEmpty条件:

Public IEnumerable GetErrors(String propertyName)
{
    if (String.IsNullOrEmpty(propertyName))
        return entity_errors;
    if (!property_errors.ContainsKey(propertyName))
        return null;
    return property_errors[propertyName];
}

答案 1 :(得分:1)

由于在我的解决方案中找不到合适的答案,因此,如果该值为null或为空,则会返回所有验证错误:

private ConcurrentDictionary<string, List<ValidationResult>> modelErrors = new ConcurrentDictionary<string, List<ValidationResult>>();

public bool HasErrors { get => modelErrors.Any(); }

public IEnumerable GetErrors(string propertyName)
{
    if (string.IsNullOrEmpty(propertyName))
    {
        return modelErrors.Values.SelectMany(x => x);   // return all errors
    }
    modelErrors.TryGetValue(propertyName, out var propertyErrors);
    return propertyErrors;
}