0

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

这是我的视图模型的片段

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 存储库。

4

2 回答 2

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); }
    }
}
于 2017-03-26T20:31:43.510 回答
0

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

看看你是如何设置/返回/评估 HasErrors 的。
您是否在属性 get 上验证模型?

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

于 2017-03-25T14:27:20.960 回答