Silverlight實例教程 - Validation用戶提交數據驗證捕獲(轉載)

Silverlight 4 Validation驗證明例系列

  在以往的Validation系列中,介紹了四種Silverlight驗證機制:html

  1. 基本異常驗證機制;
  2. DataAnnotation驗證機制;
  3. IDataErrorInfo客戶端同步驗證機制;
  4. INotifyDataErrorInfo服務器端異步驗證機制;

  在每篇的實例中,你們都能發現這幾種Silverlight Validation機制是根據異常主動觸發的驗證機制。本文將介紹另一種經常使用驗證方法,該驗證方法是基於以上四種驗證機制,咱們稱之爲被動型觸發驗證。express

  概述windows

   被動型觸發驗證,簡單的理解,就是當用戶交互時,經過用戶行爲被動激活Validation驗證機制。簡 單的例子,一個須要註冊用戶的頁面,其表格中,沒有任何填寫數據,而初始化後,對該表格不進行驗證處理,僅當用戶點擊「註冊」按鈕後,對須要填寫的控件進 行驗證判斷,這時就須要用到被動型觸發驗證。服務器

  UpdateSourceTrigger屬性框架

   UpdateSourceTrigger屬性是Validation數據驗證的重要屬性之一,該屬性主要表示數據源觸發更新的執行時間。主要運用在Binding中,例如:異步

< TextBox Text ="{Binding Username, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnDataErrors=True,
ValidatesOnExceptions=True, UpdateSourceTrigger=Explicit}"
/>

  經過MSDN,咱們能夠了解到UpdateSourceTrigger屬性有兩個值。spa

  1. Default,該值返回目標依賴屬性的默認UpdateSourceTrigger值,多數控件返回的默認值爲PropertyChanged,而Text屬性的默認值爲LostFocus。.net

  2. Explicit,若是設置UpdateSourceTrigger屬性設置爲顯式方式,則須要開發人員手工調用UpdateSource方法,才能對數據源更新事件進行觸發,不然不作任何操做。3d

  在默認狀況下,UpdateSourceTrigger屬性爲Default。這也就是儘管在前幾篇的實例中,在Binding中,咱們沒有設 置任何PropertyChanged信息,仍舊可以觸發驗證。當數據綁定被修改後,綁定會自動觸發UpdateSourceTrigger屬性,經過該 屬性,對綁定數據源的數據成員進行驗證,若是有異常,則返回False,反之爲True。調試

  提交數據驗證捕獲實例 

  在文章開始,咱們介紹了被動型觸發驗證方法,該方法在實際項目中是經常使用功能之一。前文說起的一個例子,註冊時,想要在用戶點擊「註冊」按鈕時對 全部填寫值使用Validation功能進行判斷,其實現方法則須要將UpdateSourceTrigger屬性設爲Explicit,在後臺中,咱們 使用代碼控制其驗證,經過這種方法,對提交數據進行驗證捕獲操做。

  下面的例程,咱們仍舊使用SilverlightValidationDemo項目,若是你沒有該項目,能夠到上一篇下載該項目源代碼,在本例中,咱們將嘗試點擊提交註冊按鈕,可是在點擊「註冊」時,對姓名,密碼和年齡進行驗證判斷。在沒有對代碼修改前,點擊「註冊」按鈕,頁面不會捕獲任何數據提交驗證,們將對姓名,密碼和年齡代碼進行簡單修改。

< StackPanel  Orientation ="Horizontal"  Margin ="5" >  
                
< TextBlock  Text ="用戶名: "  VerticalAlignment ="Center" />  
                
< TextBox  x:Name ="txtUserName"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  
Text =" {Binding Path=Name, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True,UpdateSourceTrigger=Explicit} "   />  
            
</ StackPanel >  
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >  
                
< TextBlock  Text ="密   碼: "  VerticalAlignment ="Center" />  
                
< TextBox  x:Name ="txtPassword"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  
Text =" {Binding Path=password, Mode=TwoWay,ValidatesOnExceptions=True, NotifyOnValidationError=True,UpdateSourceTrigger=Explicit} "   />  
            
</ StackPanel >  
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >  
                
< TextBlock  Text ="年   齡: "  VerticalAlignment ="Center" />  
                
< TextBox  x:Name ="txtAge"  Width ="200"  DataContext =" {Binding Source={StaticResource UserDataContext}} "  
Text =" {Binding Path=Age, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True,UpdateSourceTrigger=Explicit} "   />  
            
</ StackPanel >

  從上面代碼能夠看出,咱們在Binding中,添加UpdateSourceTrigger=Explicit,根據上文提示,咱們必須手工對 數據源進行更新觸發。這裏須要解釋一點,若是UpdateSourceTrigger=Default,當綁定模式爲Twoway時,TextBox失去 焦點,則會觸發數據源更新,這一切都有Silverlight API控制,而咱們設置UpdateSourceTrigger=Explicit後,則由開發人員控制。

  UpdateSourceTrigger設置爲Explicit後,咱們須要手動調用UpdateSource,才能對數據源進行驗證。在UpdateSource前,咱們須要使用代碼獲取到綁定對象的實例。獲取綁定對象實例,須要使用到BindingExpression類,BindingExpression類中包含了一個綁定對象實例的全部信息。而獲取一個BindingExpression對象,則須要使用GetBindingExpression方法,對驗證目標對象屬性進行捕獲。例如,咱們實例中的代碼:

BindingExpression beUsername  =  txtUserName.GetBindingExpression(TextBox.TextProperty); 
beUsername.UpdateSource();

  經過txtUserName.GetBindingExpression獲取TextBox對象的TextProperty綁定屬性,而後賦值 到beUsername。而後調用UpdateSource方法,實現手工更新數據源,同時,數據源的修改,天然也就被動激活了後臺的驗證機制。在實際項 目中,僅獲取到了驗證錯誤信息,仍是不夠的,頁面仍是會繼續進行下一步流程代碼,而這裏,咱們將會使用Validation類中的方法和屬性,對驗證錯誤 進行簡單的判斷。

private   void  btReg_Click( object  sender, RoutedEventArgs e) 

    BindingExpression beUsername 
=  txtUserName.GetBindingExpression(TextBox.TextProperty); 
    beUsername.UpdateSource(); 

    
if  (Validation.GetHasError(txtUserName)) 
        
return
}

  上面代碼,使用Validation類中的GetHasError()方法確認驗證是否有錯誤,若是有,則返回空,UI的Validation 機制將會接管前臺驗證錯誤顯示,然後臺,則會忽略該點擊事件操做。若是你想獲取跟爲詳細的驗證錯誤信息提示,能夠經過Validation類中的 GetErrors()方法枚舉出全部被捕獲的驗證錯誤信息。

List < ValidationError >  errors  =   new  List < ValidationError > (); 
foreach  (ValidationError erroritem  in  Validation.GetErrors(txtUserName)) 

     errors.Add(erroritem); 
}

  最終註冊提交代碼以下:

         private   void  btReg_Click( object  sender, RoutedEventArgs e)
        {
            BindingExpression beUsername 
=  txtUserName.GetBindingExpression(TextBox.TextProperty);
            beUsername.UpdateSource();
            BindingExpression bePassword 
=  txtPassword.GetBindingExpression(TextBox.TextProperty);
            bePassword.UpdateSource();
            BindingExpression beAge 
=  txtAge.GetBindingExpression(TextBox.TextProperty);
            beAge.UpdateSource();


            
if  (Validation.GetHasError(txtUserName))
                
return ;
            
if  (Validation.GetHasError(txtPassword))
                
return ;
            
if  (Validation.GetHasError(txtAge))
                
return ;


// 捕獲驗證錯誤集合演示
            List < ValidationError >  errors  =   new  List < ValidationError > ();
            
foreach  (ValidationError erroritem  in  Validation.GetErrors(txtUserName))
            {
                errors.Add(erroritem);
            }
        }

  其結果,點擊「註冊」按鈕,則會提示驗證錯誤,修改內容後,再次點擊「註冊」按鈕,驗證經過後,進入註冊流程。

  最後須要說明一點,這種驗證方法,和驗證機制是無關的,不管使用哪種驗證機制,均可以使用該方法,進行用戶交互數據驗證。今天就介紹到這裏,但願對你們有所幫助。

  源代碼下載

相關文章
相關標籤/搜索