
在以往的Validation系列中,介紹了四種Silverlight驗證機制:
1. 基本異常驗證機制;
1. DataAnnotation驗證機制;
1. IDataErrorInfo客戶端同步驗證機制;
1. INotifyDataErrorInfo服務器端異步驗證機制;
在每篇的實例中,大家都能發現這幾種Silverlight Validation機制是根據異常主動觸發的驗證機制。本文將介紹另外一種常用驗證方法,該驗證方法是基于以上四種驗證機制,我們稱之為被動型觸發驗證。
**概述**
被動型觸發驗證,簡單的理解,就是當用戶交互時,通過用戶行為被動激活Validation驗證機制。簡單的例子,一個需要注冊用戶的頁面,
其表格中,沒有任何填寫數據,而初始化后,對該表格不進行驗證處理,僅當用戶點擊“注冊”按鈕后,對需要填寫的控件進行驗證判斷,這時就需要用到被動型觸發驗證。
**UpdateSourceTrigger屬性**
[UpdateSourceTrigger屬性](http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx)是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項目,如果你沒有該項目,可以到[上一篇](http://www.cnblogs.com/jv9/archive/2010/09/15/1826547.html)下載該項目源代碼,
在本例中,我們將嘗試點擊提交注冊按鈕,但是在點擊“注冊”時,對姓名,密碼和年齡進行驗證判斷。在沒有對代碼修改前,點擊“注冊”按鈕,頁面不會捕獲任何數據提交驗證,
我們將對姓名,密碼和年齡代碼進行簡單修改
~~~
<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類](http://msdn.microsoft.com/en-us/library/system.windows.data.bindingexpression.aspx),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);?
}
~~~
[](http://images.cnblogs.com/cnblogs_com/jv9/WindowsLiveWriter/SilverlightValidation_A8DB/Image00701_2.jpg)
最終注冊提交代碼如下:
~~~
????????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);
????????????}
????????}
~~~
其結果,點擊“注冊”按鈕,則會提示驗證錯誤,修改內容后,再次點擊“注冊”按鈕,驗證通過后,進入注冊流程。

?
最后需要說明一點,這種驗證方法,和驗證機制是無關的,無論使用哪一種驗證機制,都可以使用該方法,進行用戶交互數據驗證。
今天就介紹到這里,希望對大家有所幫助。
[源代碼下載](http://www.silverlightchina.net/uploads/soft/100920/1-100920133156.rar)
歡迎大家加入“專注Silverlight”QQ技術群,目前,1-6群都已經滿員,新開500人七群,歡迎大家加入一起學習討論Silverlight&WPF開發技術。
22308706(一群) 超級群500人滿
37891947(二群) 超級群500人滿
100844510(三群) 高級群200人滿
32679922(四群) 超級群500人滿
23413513(五群) 高級群200人滿
32679955(六群) 超級群500人滿
61267622(七群 推薦) 超級群500人未滿
- 前言
- Out of Browser開篇
- Out of Browser配置,安裝和卸載
- Out of Browser的自定義應用
- Out of Browser存取本地文件系統
- Out of Browser與COM的交互基礎
- Out of Browser與Office的互操作
- Out of Browser的Debug和Notifications窗口
- Out of Browser音樂播放器
- Out of Browser與COM互操作實例
- Out of Browser在線更新和Silent安裝
- Validation數據驗證開篇
- Validation數據驗證基礎屬性和事件
- Validation數據驗證DataAnnotation機制和調試技巧
- Validation服務器端異步數據驗證
- Validation客戶端同步數據驗證
- Validation用戶提交數據驗證捕獲
- Datagrid,Dataform數據驗證和ValidationSummary
- 自定義擴展Validation類,驗證框架的總結和建議
- Navigation導航框架開篇
- 理解Navigation導航框架Frame類
- 理解Navigation導航框架Page類
- Navigation導航框架URI映射機制
- Navigation導航框架傳遞參數