我有一个Silverlight用户控件,其上有几个字段,通过RIA服务绑定到数据库。我在这些字段上使用NotifyOnValidationError = true,ValidatesOnExceptions = true,并使用ValidationSummary控件显示字段的任何错误。一切正常。
但是,在usercontrol上我有一个“Save”按钮,单击时将调用context.SubmitChanges()。问题是即使存在错误,也可以单击此按钮(因此调用SubmitChanges)。
如何确定是否仍存在验证错误,或者是否仍然将“保存”按钮的IsEnabled属性绑定到验证状态?
答案 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
}