我的模型实现了INotifyDataErrorInfo
接口以验证它的属性,并且它工作正常,但问题是,属性HasErrors默认是false,所以当我第一次运行我的应用程序并单击save(表格为空)视图不会引发任何错误,并保存数据。
这是我的viewmodel
的snipetpublic 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回购。
答案 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验证的结构,我可以给出更好的答案。