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

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://kevinfan.blog.51cto.com/1037293/394933

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

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

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

 

概述

 

被動型觸發驗證,簡單的理解,就是當用戶交互時,通過用戶行爲被動激活Validation驗證機制。簡單的例子,一個需要註冊用戶的頁面,

其表格中,沒有任何填寫數據,而初始化後,對該表格不進行驗證處理,僅當用戶點擊“註冊”按鈕後,對需要填寫的控件進行驗證判斷,這時就需要用到被動型觸發驗證。

 

UpdateSourceTrigger屬性

 

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

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

 


通過MSDN,我們可以瞭解到UpdateSourceTrigger屬性有兩個值,

 

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

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

 

在默認情況下,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);
            }
        }

 

 

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

 

 

最後需要說明一點,這種驗證方法,和驗證機制是無關的,無論使用哪一種驗證機制,都可以使用該方法,進行用戶交互數據驗證。

今天就介紹到這裏,希望對大家有所幫助。

 

 

源代碼下載

 

本文出自 “專注Silverlight ” 博客,請務必保留此出處http://kevinfan.blog.51cto.com/1037293/394933

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章