在以往的Validation系列中,介紹了四種Silverlight驗證機制:
- 基本異常驗證機制;
- DataAnnotation驗證機制;
- IDataErrorInfo客戶端同步驗證機制;
- INotifyDataErrorInfo服務器端異步驗證機制;
在每篇的實例中,大家都能發現這幾種Silverlight Validation機制是根據異常主動觸發的驗證機制。本文將介紹另外一種常用驗證方法,該驗證方法是基於以上四種驗證機制,我們稱之爲被動型觸發驗證。
概述
被動型觸發驗證,簡單的理解,就是當用戶交互時,通過用戶行爲被動激活Validation驗證機制。簡單的例子,一個需要註冊用戶的頁面,
其表格中,沒有任何填寫數據,而初始化後,對該表格不進行驗證處理,僅當用戶點擊“註冊”按鈕後,對需要填寫的控件進行驗證判斷,這時就需要用到被動型觸發驗證。
UpdateSourceTrigger屬性
UpdateSourceTrigger屬性 是Validation數據驗證的重要屬性之一,該屬性主要表示數據源觸發更新的執行時間。主要運用在Binding中,例如
通過MSDN,我們可以瞭解到UpdateSourceTrigger屬性有兩個值,
1. Default ,該值返回目標依賴屬性的默認UpdateSourceTrigger值,多數控件返回的默認值爲PropertyChanged,而Text屬性的默認值爲LostFocus。
2. Explicit ,如果設置UpdateSourceTrigger屬性設置爲顯式方式,則需要開發人員手工調用UpdateSource方法,才能對數據源更新事件進行觸發,否則不做任何操作。
在默認情況下,UpdateSourceTrigger屬性爲Default。這也就是儘管在前幾篇的實例中,在Binding中,我們沒有設置任何PropertyChanged信息,仍舊能夠觸發驗證。
當數據綁定被修改後,綁定會自動觸發UpdateSourceTrigger屬性,通過該屬性,對綁定數據源的數據成員進行驗證,如果有異常,則返回False,反之爲True。
提交數據驗證捕獲實例
在文章開始,我們介紹了被動型觸發驗證方法,該方法在實際項目中是常用功能之一。前文提及的一個例子,註冊時,想要在用戶點擊“註冊”按鈕時對所有填寫值使用Validation功能進行判斷,
其實現方法則需要將UpdateSourceTrigger屬性設爲Explicit,在後臺中,我們使用代碼控制其驗證,通過這種方法,對提交數據進行驗證捕獲操作。
下面的例程,我們仍舊使用SilverlightValidationDemo項目,如果你沒有該項目,可以到上一篇 下載該項目源代碼,
在本例中,我們將嘗試點擊提交註冊按鈕,但是在點擊“註冊”時,對姓名,密碼和年齡進行驗證判斷。在沒有對代碼修改前,點擊“註冊”按鈕,頁面不會捕獲任何數據提交驗證,
我們將對姓名,密碼和年齡代碼進行簡單修改
< TextBlock Text ="用戶名: " VerticalAlignment ="Center" />
< TextBox x:Name ="txtUserName" Width ="200" DataContext =" {Binding Source={StaticResource UserDataContext}} "
</ StackPanel >
< StackPanel Orientation ="Horizontal" Margin ="5" >
< TextBlock Text ="密 碼: " VerticalAlignment ="Center" />
< TextBox x:Name ="txtPassword" Width ="200" DataContext =" {Binding Source={StaticResource UserDataContext}} "
</ StackPanel >
< StackPanel Orientation ="Horizontal" Margin ="5" >
< TextBlock Text ="年 齡: " VerticalAlignment ="Center" />
< TextBox x:Name ="txtAge" Width ="200" DataContext =" {Binding Source={StaticResource UserDataContext}} "
</ StackPanel >
從上面代碼可以看出,我們在Binding中,添加UpdateSourceTrigger=Explicit,根據上文提示,我們必須手工對數據源進行更新觸發。
這裏需要解釋一點,如果UpdateSourceTrigger=Default,當綁定模式爲Twoway時,TextBox失去焦點,則會觸發數據源更新,
這一切都有Silverlight API控制,而我們設置UpdateSourceTrigger=Explicit後,則由開發人員控制。
UpdateSourceTrigger設置爲Explicit後,我們需要手動調用UpdateSource,才能對數據源進行驗證。
在UpdateSource前,我們需要使用代碼獲取到綁定對象的實例。獲取綁定對象實例,需要使用到BindingExpression類 ,BindingExpression類中包含了一個綁定對象實例的所有信息。
而獲取一個BindingExpression對象,則需要使用GetBindingExpression方法,對驗證目標對象屬性進行捕獲。
例如,我們實例中的代碼:
beUsername.UpdateSource();
通過txtUserName.GetBindingExpression獲取TextBox對象的TextProperty綁定屬性,然後賦值到beUsername。
然後調用UpdateSource方法,實現手工更新數據源,同時,數據源的修改,自然也就被動激活了後臺的驗證機制。
在實際項目中,僅獲取到了驗證錯誤信息,還是不夠的,頁面還是會繼續進行下一步流程代碼,而這裏,我們將會使用Validation類中的方法和屬性,對驗證錯誤進行簡單的判斷,
{
BindingExpression beUsername = txtUserName.GetBindingExpression(TextBox.TextProperty);
beUsername.UpdateSource();
if (Validation.GetHasError(txtUserName))
return ;
}
上面代碼,使用Validation類中的GetHasError()方法確認驗證是否有錯誤,如果有,則返回空,UI的Validation機制將會接管前臺驗證錯誤顯示,而後臺,則會忽略該點擊事件操作。
如果你想獲取跟爲詳細的驗證錯誤信息提示,可以通過Validation類中的GetErrors()方法枚舉出所有被捕獲的驗證錯誤信息。
foreach (ValidationError erroritem in Validation.GetErrors(txtUserName))
{
errors.Add(erroritem);
}
最終註冊提交代碼如下:
{
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