2010-11-16 69 views
1

我有一個Silverlight用戶控件,其上有幾個字段,通過RIA服務綁定到數據庫。我在這些字段上使用NotifyOnValidationError = true,ValidatesOnExceptions = true,並使用ValidationSummary控件顯示字段的任何錯誤。這一切工作正常。如何找出Silverlight用戶控件的驗證狀態?

但是,在用戶控件上,我有一個「保存」按鈕,單擊時將調用context.SubmitChanges()。問題在於,即使存在錯誤,也可以單擊此按鈕(並調用SubmitChanges)。

如何確定是否仍存在驗證錯誤,或者是否有將「保存」按鈕的IsEnabled屬性綁定到驗證狀態的方法?

回答

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

您可以將保存按鈕的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  
}