交叉发布的道歉(我在Silverlight Forum上问了这个问题,但没有回复)
我有一个实体,我正在尝试使用验证,所以我装饰了一个属性,如:
[Required]
[StringLength(10)]
public string Code
{
get
{
return this.code;
}
set
{
if (this.code != value)
{
this.code = value;
this.SendPropertyChanged("Code");
}
}
}
我有一个绑定到网格的这些对象的列表。如果我输入一个空条目,则会显示验证错误。如果我把代码放得太久,我会收到验证错误。完善!除了...
我希望能够阻止用户保存实体,因此我将以下内容添加到我的实体中:
public bool IsValid()
{
try
{
this.Validate();
}
catch
{
return false;
}
return true;
}
public void Validate()
{
var ctx = new ValidationContext(this, null, null);
Validator.ValidateObject(this, ctx);
}
当我去保存时,我在每个对象上调用IsValid方法,如果它是假的则不保存。 这适用于所需的属性(如果Code为空则不会保存)但不适用于StringLength(我可以使用任何长度代码保存)。
我在这里的一个简单项目中重现了这个:
http://walkersretreat.co.nz/files/Slvalidation.zip
有人可以帮忙吗?
谢谢!
标记
答案 0 :(得分:0)
[CustomValidation( typeof( MyExtraClassValidation ), "Validate" )]
public class MyExtraClass : Entity, IEditableObject, INotifyPropertyChanged
{
/****/
}
public class MyExtraClassValidation
{
public MyExtraClassValidation ()
{}
public static ValidationResult Validate( MyExtraClass myExtraClass )
{
if ( /**class is not valid*/)
return new ValidationResult( "Oops" );
return ValidationResult.Success;
}
}
当然,你的界面可能完全是一个接口,但我建议你使用它。
此外,您可以从控件中调用validateHandler并检查,例如,在每个用户键按下后。