如何使用INotifyDataErrorInfo在单个方法中return包含错误的属性?

How to return the property that contains an error in a single method using INotifyDataErrorInfo?

问题

我能够为每个 属性 使用它自己的单独方法实施验证。我遇到的问题是,代码太多,每个方法都有太多方法 属性 - 我的目标是将所有方法都变成一个方法。

我现在遇到了一个问题,关于如何在我的单一方法中识别哪个 属性 包含错误。

服务

在这里,我构建了用于检查 User 属性.

中的用户名和密码的服务
public interface ILoginValidationService
{
    bool ValidateUser(UserModel user, out ICollection<string> errors);
}

public class LoginValidationService : ILoginValidationService
{


    public bool ValidateUser(UserModel user, out ICollection<string> errors)
    {
        errors = new List<string>();
        if (string.IsNullOrWhiteSpace(user.FirstName))
        {
            errors.Add("First Name cannot be empty");
        }
        if (string.IsNullOrWhiteSpace(user.LastName))
        {
            errors.Add("Last Name cannot be empty");
        }

        return errors.Count == 0;
    }
}

实际验证

在这里,我创建了 2 个方法 ValidationValidateUser,它们采用 UserModel.

的单个参数

Validation 方法创建一个新的 UserModel 对象,从 TextBox 绑定到的 public 属性中获取 FirstNameLastName。然后它调用 ValidateUser(user) 传递用户对象。

ValidateUser方法中,是我遇到问题的地方。

此方法目前以FirstNamevar prop = nameof(FirstName);的属性为例

接下来,您将看到 bool isValid 属性,这会验证用户。

它进行验证,returns var prop = nameof(FirstName); 中提到的 FirstName 的错误,这里是输出:查看代码下方的图像

private ILoginValidationService ValidationService { get; set; }
private bool Validation()
{
    UserModel user = new UserModel
    {
        FirstName = FirstName,
        LastName = LastName
    };
    ValidateUser(user);
    return _validationErrors.Count == 0 ? false : true;
}
private void ValidateUser(UserModel user)
{
    var prop = nameof(FirstName);
    ICollection<string> validationErrors = null;
    bool isValid = ValidationService.ValidateUser(user, out validationErrors);

    if (!isValid)
    {
        _validationErrors[prop] = validationErrors;
        RaiseErrorsChanged(prop);
    }
    else if (_validationErrors.ContainsKey(prop))
    {
        _validationErrors.Remove(prop);
        RaiseErrorsChanged(prop);
    }
}

#region INotifyDataErrorInfo members

private readonly Dictionary<string, ICollection<string>> _validationErrors = new Dictionary<string, ICollection<string>>();

public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
private void RaiseErrorsChanged(string propertyName)
{
    if (ErrorsChanged != null)
        ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
}

public IEnumerable GetErrors(string propertyName)
{
    if (string.IsNullOrEmpty(propertyName)
        || !_validationErrors.ContainsKey(propertyName))
        return null;

    return _validationErrors[propertyName];
}

public bool HasErrors
{
    get { return _validationErrors.Count > 0; }
}
#endregion

输出

它的作用是在 FirstName.

下方显示错误

问题

我目前有 var prop = nameof(FirstName); 的地方,我如何根据 bool isValid = ValidationService.ValidateUser(user, out validationErrors); 确定哪个 属性 有错误?并显示与其相关的错误 属性?

您可以考虑创建自己的 class 来报告错误,而不是使用 ICollection 和字符串。
像这样简单的东西:

class ErrorInformation
{
    public string PropertyName {get;}
    public string Message {get;}
}

在 ValidateUser 中,您可以添加 ErroInformation 的实例,而不是将字符串添加到您的集合中。