Silverlight 3验证 - 手动验证不起作用?

时间:2009-09-29 21:43:08

标签: silverlight validation silverlight-3.0

交叉发布的道歉(我在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

有人可以帮忙吗?

谢谢!

标记

1 个答案:

答案 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并检查,例如,在每个用户键按下后。