Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用INotifyDataErrorInfo进行Mvvm模型验证_C#_Wpf_Mvvm_Inotifydataerrorinfo - Fatal编程技术网

C# 使用INotifyDataErrorInfo进行Mvvm模型验证

C# 使用INotifyDataErrorInfo进行Mvvm模型验证,c#,wpf,mvvm,inotifydataerrorinfo,C#,Wpf,Mvvm,Inotifydataerrorinfo,我的模型实现了INotifyDataErrorInfo接口来验证它的属性,它工作得很好,但问题是,属性HasErrors默认为false,因此当我第一次运行我的应用程序并单击save form为空时,视图不会出现任何错误,数据也会被保存 这是我的viewmodel的剪贴画 public LoggingViewModel() { _loggingCommand = new RelayCommand(checkCredentials, canExecuteLogginForm); _

我的模型实现了INotifyDataErrorInfo接口来验证它的属性,它工作得很好,但问题是,属性HasErrors默认为false,因此当我第一次运行我的应用程序并单击save form为空时,视图不会出现任何错误,数据也会被保存

这是我的viewmodel的剪贴画

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;
}
您如何在应用程序中处理这种情况


有关详细信息,我创建了此回购。

视图模型逻辑正确。 问题在于模型内的验证逻辑,当hasrerrors=true时,该逻辑返回hasrerrors=False

看看您是如何设置/返回/评估HASSERRORS的。 您正在验证属性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验证的结构,我可以给出一个更好的答案。

由于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); }
    }
}

您是否可以更新您的代码,以便默认情况下HasErrors为True?这或在LogginModel构造函数中强制验证?HasErrors是INotifyDataErrorInfo接口的成员,当表单中没有错误时,它应返回false。如何强制验证?