使用 INotifyDataErrorInfo 进行 Mvvm 模型验证

Mvvm model validation with INotifyDataErrorInfo

我的模型实现了 INotifyDataErrorInfo 接口来验证它的属性,它工作正常,但问题是,属性 HasErrors 默认为 false,所以当我 运行我的应用程序第一次点击保存(表单为空)视图没有错误,数据被保存。

这是我的视图模型的片段

public LoggingViewModel()
{
    _loggingCommand = new RelayCommand(checkCredentials, canExecuteLogginForm);
    _logingModel = new LoggingModel();

    // I raise this event in the 'OnErrorsChanged' method in the model,
    // so my ViewModel can subscribe and check the 'HasErrors' property.
    _logingModel.FormIsValid += (o, e) => _loggingCommand.RaiseCanExecuteChanged();
}

private bool canExecuteLogginForm()
{
    return !_logingModel.HasErrors;
}

您如何在您的应用中处理这种情况?

有关详细信息,我创建了这个 github 存储库。

ViewModel 逻辑正确。
问题出在模型内部的验证逻辑中,当 HasErrors = true 时返回 HasErrors = False。

看看你怎么样setting/returning/evaluating有错误。
您是否在 属性 上验证模型?

    public bool HasErrors
    {
        get
        {
            bool hasErrors = false; // Default true here?

            // Validation logic ...

            return hasErrors;
        }
    }

您是否将 HasError 值存储在 属性 中并将其设置在其他地方?

    public LoggingModel()
    {
        HasErrors = true; // Default true here?
    }

    public bool HasErrors { get; set; } // Gets set via validation logic

只是一些想法,就像我说的,如果你能展示你如何处理 INotifyDataErrorInfo 验证的结构,我可以给出更好的答案。

由于 LogginModel 实际上处于无效状态,您应该在其构造函数中调用 ValidateForm() 方法以实际将其设置为该状态并填充 _errors 字典HasErrors 属性 到 return true 的顺序:

public class LoggingModel : PocoBase
{
    public LoggingModel()
    {
        ValidateForm();
    }

    [Display(Name = "Name")]
    [MaxLength(32), MinLength(4)]
    public string UserName
    {
        get { return GetValue<string>(); }
        set { SetValue(value); }
    }

    [Required]
    public string Password
    {
        get { return GetValue<string>(); }
        set { SetValue(value); }
    }
}