使用INotifyDataErrorInfo进行Mvvm模型验证

时间:2017-03-25 13:15:17

标签: c# wpf mvvm inotifydataerrorinfo

我的模型实现了INotifyDataErrorInfo接口以验证它的属性,并且它工作正常,但问题是,属性HasErrors默认是false,所以当我第一次运行我的应用程序并单击save(表格为空)视图不会引发任何错误,并保存数据。

这是我的viewmodel

的snipet
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;
}

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

有关详细信息,我创建了此convert a standalone machine into one member replica set回购。

2 个答案:

答案 0 :(得分:1)

由于LogginModel实际上处于无效状态,因此您应该在其构造函数中调用ValidateForm()方法以实际将其设置为此状态并填充_ errors字典以便HasErrors属性应该返回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); }
    }
}

答案 1 :(得分:0)

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

看看你如何设置/返回/评估HasErrors 你在属性get上验证Model吗?

    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验证的结构,我可以给出更好的答案。