[英]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.