繁体   English   中英

使用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仓库。

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

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

看一下如何设置/返回/评估HasErrors。
您是否在验证属性获取模型?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM