如何正确地实现INotifyDataErrorInfo?(How to properly imple

2019-08-20 05:47发布

我是一个有点困惑MSDN例子 。

目前还不清楚如何处理和设置实体realted错误。

代码示例中:

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

但对于GetErrors文档()指出:

propertyName的 - 检索验证错误的属性的名称; 或者null或空,检索实体级别错误

又如建议刚刚返回字典的_errors.Values。 而这仅仅是所有属性错误,但同样没有实体错误。

Answer 1:

按照从文档中的“备注”部分: MSDN:INotifyDataErrorInfo接口

该接口支持数据实体类来实现自定义的验证规则和异步公开验证结果。 这个接口还支持自定义错误对象,每个属性的多个错误,交叉性质的错误,和实体级别的错误。 跨属性的错误是影响多个属性的错误。 你可以用一个或所有受影响的属性的这些错误联系起来,或者你可以把它们作为实体级别的错误。 公司层面的错误是,要么影响多个属性或影响整个实体,而不影响特定属性的错误。

我可能会建议实施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];
}


Answer 2:

由于我还没有找到一个正确的答案在这里我的解决方案,所有的验证错误时返回值为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;
}


文章来源: How to properly implement INotifyDataErrorInfo?