如何找出Silverlight用户控件的验证状态?

时间:2010-11-16 13:53:51

标签: silverlight validation binding

我有一个Silverlight用户控件,其上有几个字段,通过RIA服务绑定到数据库。我在这些字段上使用NotifyOnValidationError = true,ValidatesOnExceptions = true,并使用ValidationSummary控件显示字段的任何错误。一切正常。

但是,在usercontrol上我有一个“Save”按钮,单击时将调用context.SubmitChanges()。问题是即使存在错误,也可以单击此按钮(因此调用SubmitChanges)。

如何确定是否仍存在验证错误,或者是否仍然将“保存”按钮的IsEnabled属性绑定到验证状态?

2 个答案:

答案 0 :(得分:2)

要在客户端验证错误仍然有效时停止保存按钮,您可以试试这个。

在您的课程(代码隐藏或视图模型)中,您将拥有一些能够提供您正在使用的RIA实体的当前实例的内容。

public SampleRIAEntity SelectedEntity { get; set; }

使用此扩展方法:

public static class RiaExtensions
{
  public static bool CheckValidation<T>( this T riaEntity ) where T : Entity
  {
    ValidationContext vc = new ValidationContext( riaEntity, null, null);
    ICollection<ValidationResult> validationResults = new List<ValidationResult>();
    return ( Validator.TryValidateObject( riaEntity, vc, validationResults ) == true );
  }
}

您可以在“保存”按钮上提供与IsEnabled一起使用的属性。

public bool HasErrors
{
  get
  {
    return SelectedEntity.CheckValidation<SampleRIAEntity>();
  }
}

然后,这将贯穿客户端可用的所有验证规则。如果存在不满足的服务器端规则,则仍然无法提交保存。

答案 1 :(得分:1)

您可以将保存按钮的IsEnabled属性绑定到ValidationSummary控件的HasErrors字段。只要验证摘要可见,这将禁用该按钮。您需要使用转换器来反转HasErrors的值

这是XAML:

    <UserControl .... > 
       <UserControl.Resources> 
           <Converters1:NotBoolConverter x:Key="NotBoolConverter" />
        </UserControl.Resources> 

        <Button IsEnabled="{Binding HasErrors, ElementName=valSummary, Converter={StaticResource NotBoolConverter}}" /> 

以下是NotBoolConverter的代码:(来自http://forums.silverlight.net/forums/p/78115/184444.aspx

internal class NegationConverter : IValueConverter
{
    #region IValueConverter Members 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { var b = (bool) value; return !b; } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    { throw new NotImplementedException(); } 
    #endregion 
}