Silverlight 4 Validation驗證明例系列
在以往的Validation系列中,介紹了四種Silverlight驗證機制:html
- 基本異常驗證機制;
- DataAnnotation驗證機制;
- IDataErrorInfo客戶端同步驗證機制;
- 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);
}
![Silverlight實例教程 - Validation用戶提交數據驗證捕獲 - qiuguangchun - sandea的我的主頁](http://static.javashuo.com/static/loading.gif)
最終註冊提交代碼以下:
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);
}
}
其結果,點擊「註冊」按鈕,則會提示驗證錯誤,修改內容後,再次點擊「註冊」按鈕,驗證經過後,進入註冊流程。
最後須要說明一點,這種驗證方法,和驗證機制是無關的,不管使用哪種驗證機制,均可以使用該方法,進行用戶交互數據驗證。今天就介紹到這裏,但願對你們有所幫助。
源代碼下載