我有一个数据表单绑定到一个对象,其属性使用System.ObjectModel.DataAnnotation属性装饰validaton.
我面临的问题是这个类的某些属性只是有条件的需要而且不需要验证.例如,当应用程序的管理员决定编辑用户时,
他或她可以输入密码/密码确认/密码问题/密码答案.或者他/她可以完全跳过这些属性.
因此,如果管理员决定输入这4个字段中的任何一个,则必须存在这些字段,并且必须应用所有这些字段的验证规则.但是,如果管理员只想更改FirstName,LastName,Email或任何其他任意属性,则无需验证与密码相关的字段.
有没有办法从验证过程中“排除”它们?
这是我使用的对象的示例:
public class RegistrationData
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string PasswordConfirm { get; set; }
public string PasswordQuestion { get; set; }
public string PasswordAnswer { get; set; }
}
我在Xaml中有一个名为registrationForm的DataForm,我得到的错误是在这段代码中:
private void RegistrationButton_Click(object sender, RoutedEventArgs e)
{
if( this.registerForm.ValidateItem() )
{
//Does not pass validaton if the password properties are not filled in.
}
}
关于如何修复它的任何想法?
我正在考虑使用两个DataForms …并将用户对象分成两部分,但这涉及很多代码……
最佳答案 我建议在RegistrationData对象上使用INotifyDataError接口.
public string LabelWrapper
{
get
{
return this.Label;
}
set
{
ValidateRequired("LabelWrapper", value, "Label required");
ValidateRegularExpression("LabelWrapper", value, @"^[\w-_ ]+$", "Characters allowed (a-z,A-Z,0-9,-,_, )");
this.Label = value;
this.RaisePropertyChanged("LabelWrapper");
}
}
public string DependentLabelWrapper
{
get
{
return this.DependentLabel;
}
set
{
if(LabelWrapper != null){
ValidateRequired("DependentLabelWrapper", value, "Label required");
ValidateRegularExpression("LabelWrapper", value, @"^[\w-_ ]+$", "Characters allowed (a-z,A-Z,0-9,-,_, )");
}
this.DependentLabel = value;
this.RaisePropertyChanged("DependentLabelWrapper");
}
}
我建议您查看此链接http://blogs.msdn.com/b/nagasatish/archive/2009/03/22/datagrid-validation.aspx以了解有关不同验证类型的更多信息.
MSDN也对如何使用它有一个很好的解释
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo%28VS.95%29.aspx