WPF选项的验证
我已经在网上坐了3个小时,没有什么帮助。 我正试图使用MVVM原则,按照以下要求在我的UI上实现验证 当前通过在我的模型上使用DataAnnotation: 例如: 1) 我只希望在单击按钮(提交)时进行验证 2) 如果我在UI上有5个验证,我也想在列表中显示它们 我研究了几种方法,但不确定使用哪种方法才能获得最适合我的2个要求的最佳实践: 伊丹弗罗 INotifyDataErrorInfo 数据注解?(目前的执行情况)WPF选项的验证,wpf,data-annotations,inotifypropertychanged,idataerrorinfo,Wpf,Data Annotations,Inotifypropertychanged,Idataerrorinfo,我已经在网上坐了3个小时,没有什么帮助。 我正试图使用MVVM原则,按照以下要求在我的UI上实现验证 当前通过在我的模型上使用DataAnnotation: 例如: 1) 我只希望在单击按钮(提交)时进行验证 2) 如果我在UI上有5个验证,我也想在列表中显示它们 我研究了几种方法,但不确定使用哪种方法才能获得最适合我的2个要求的最佳实践: 伊丹弗罗 INotifyDataErrorInfo 数据注解?(目前的执行情况) 任何能给我指出正确方向的人,有什么建议吗?你应该阅读以下博文:。它提供了一
任何能给我指出正确方向的人,有什么建议吗?你应该阅读以下博文:。它提供了一个可以使用数据注释和
INotifyDataErrorInfo
界面实现验证的示例:
public class ViewModel : INotifyDataErrorInfo
{
private readonly Dictionary<string, ICollection<string>>
_validationErrors = new Dictionary<string, ICollection<string>>();
private readonly Model _user = new Model();
public string Username
{
get { return _user.Username; }
set
{
_user.Username = value;
ValidateModelProperty(value, "Username");
}
}
public string Name
{
get { return _user.Name; }
set
{
_user.Name = value;
ValidateModelProperty(value, "Name");
}
}
protected void ValidateModelProperty(object value, string propertyName)
{
if (_validationErrors.ContainsKey(propertyName))
_validationErrors.Remove(propertyName);
ICollection<ValidationResult> validationResults = new List<ValidationResult>();
ValidationContext validationContext =
new ValidationContext(_user, null, null) { MemberName = propertyName };
if (!Validator.TryValidateProperty(value, validationContext, validationResults))
{
_validationErrors.Add(propertyName, new List<string>());
foreach (ValidationResult validationResult in validationResults)
{
_validationErrors[propertyName].Add(validationResult.ErrorMessage);
}
}
RaiseErrorsChanged(propertyName);
}
protected void ValidateModel()
{
_validationErrors.Clear();
ICollection<ValidationResult> validationResults = new List<ValidationResult>();
ValidationContext validationContext = new ValidationContext(_user, null, null);
if (!Validator.TryValidateObject(_user, validationContext, validationResults, true))
{
foreach (ValidationResult validationResult in validationResults)
{
string property = validationResult.MemberNames.ElementAt(0);
if (_validationErrors.ContainsKey(property))
{
_validationErrors[property].Add(validationResult.ErrorMessage);
}
else
{
_validationErrors.Add(property, new List<string> { validationResult.ErrorMessage });
}
}
}
/* Raise the ErrorsChanged for all properties explicitly */
RaiseErrorsChanged("Username");
RaiseErrorsChanged("Name");
}
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
private void RaiseErrorsChanged(string propertyName)
{
if (ErrorsChanged != null)
ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
}
public System.Collections.IEnumerable GetErrors(string propertyName)
{
if (string.IsNullOrEmpty(propertyName)
|| !_validationErrors.ContainsKey(propertyName))
return null;
return _validationErrors[propertyName];
}
public bool HasErrors
{
get { return _validationErrors.Count > 0; }
}
}
公共类视图模型:INotifyDataErrorInfo
{
专用只读词典
_validationErrors=新字典();
私有只读模型_user=new Model();
公共字符串用户名
{
获取{return\u user.Username;}
设置
{
_user.Username=值;
ValidateModelProperty(值,“用户名”);
}
}
公共字符串名
{
获取{return\u user.Name;}
设置
{
_user.Name=值;
ValidateModelProperty(值,“名称”);
}
}
受保护的void ValidateModelProperty(对象值、字符串propertyName)
{
if(_validationErrors.ContainsKey(propertyName))
_validationErrors.Remove(propertyName);
ICollection validationResults=新列表();
ValidationContext ValidationContext=
新的ValidationContext(_user,null,null){MemberName=propertyName};
if(!Validator.TryValidateProperty(值、validationContext、validationResults))
{
_添加(propertyName,new List());
foreach(ValidationResult ValidationResult in validationResults)
{
_validationErrors[propertyName].Add(validationResult.ErrorMessage);
}
}
RaiserRorschanged(propertyName);
}
受保护的void ValidateModel()
{
_validationErrors.Clear();
ICollection validationResults=新列表();
ValidationContext ValidationContext=新的ValidationContext(_user,null,null);
if(!Validator.TryValidateObject(_user,validationContext,validationResults,true))
{
foreach(ValidationResult ValidationResult in validationResults)
{
string属性=validationResult.MemberNames.ElementAt(0);
if(_validationErrors.ContainsKey(属性))
{
_validationErrors[property].Add(validationResult.ErrorMessage);
}
其他的
{
_Add(属性,新列表{validationResult.ErrorMessage});
}
}
}
/*明确提出所有属性的ErrorsAnged*/
RaiserRorschanged(“用户名”);
RaiseErrorsChanged(“名称”);
}
公共事件事件处理程序错误更改;
私有void raiserRorschanged(字符串属性名称)
{
if(ErrorsChanged!=null)
ErrorsChanged(这是新数据ErrorSchangedEventArgs(propertyName));
}
public System.Collections.IEnumerable GetErrors(字符串propertyName)
{
if(string.IsNullOrEmpty(propertyName)
||!\u validationErrors.ContainsKey(propertyName))
返回null;
返回_validationErrors[propertyName];
}
公共布尔错误
{
获取{return\u validationErrors.Count>0;}
}
}
您应该遵循一些教程,例如,本教程涵盖的基础非常好
public class ViewModel : INotifyDataErrorInfo
{
private readonly Dictionary<string, ICollection<string>>
_validationErrors = new Dictionary<string, ICollection<string>>();
private readonly Model _user = new Model();
public string Username
{
get { return _user.Username; }
set
{
_user.Username = value;
ValidateModelProperty(value, "Username");
}
}
public string Name
{
get { return _user.Name; }
set
{
_user.Name = value;
ValidateModelProperty(value, "Name");
}
}
protected void ValidateModelProperty(object value, string propertyName)
{
if (_validationErrors.ContainsKey(propertyName))
_validationErrors.Remove(propertyName);
ICollection<ValidationResult> validationResults = new List<ValidationResult>();
ValidationContext validationContext =
new ValidationContext(_user, null, null) { MemberName = propertyName };
if (!Validator.TryValidateProperty(value, validationContext, validationResults))
{
_validationErrors.Add(propertyName, new List<string>());
foreach (ValidationResult validationResult in validationResults)
{
_validationErrors[propertyName].Add(validationResult.ErrorMessage);
}
}
RaiseErrorsChanged(propertyName);
}
protected void ValidateModel()
{
_validationErrors.Clear();
ICollection<ValidationResult> validationResults = new List<ValidationResult>();
ValidationContext validationContext = new ValidationContext(_user, null, null);
if (!Validator.TryValidateObject(_user, validationContext, validationResults, true))
{
foreach (ValidationResult validationResult in validationResults)
{
string property = validationResult.MemberNames.ElementAt(0);
if (_validationErrors.ContainsKey(property))
{
_validationErrors[property].Add(validationResult.ErrorMessage);
}
else
{
_validationErrors.Add(property, new List<string> { validationResult.ErrorMessage });
}
}
}
/* Raise the ErrorsChanged for all properties explicitly */
RaiseErrorsChanged("Username");
RaiseErrorsChanged("Name");
}
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
private void RaiseErrorsChanged(string propertyName)
{
if (ErrorsChanged != null)
ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
}
public System.Collections.IEnumerable GetErrors(string propertyName)
{
if (string.IsNullOrEmpty(propertyName)
|| !_validationErrors.ContainsKey(propertyName))
return null;
return _validationErrors[propertyName];
}
public bool HasErrors
{
get { return _validationErrors.Count > 0; }
}
}