
[上篇](http://www.cnblogs.com/jv9/admin/Silverlight實例教程%20-%20Validation數據驗證開篇)介紹了Silverlight的Validation數據驗證的好處和概述,其中了解到Silverlight數據驗證方法可以被抽象為語法驗證和語義驗證,其中前者是通過數據類型定義對比驗證,而后者是通過當前輸入數據根據特定數據限制代碼進行驗證。本篇將在以上抽象方法的基礎上結合實例,介紹Silverlight Validation數據驗證類中常用屬性和方法。
本篇,我們將創建一個新的實例項目,SilverlightValidationDemo

在MainPage,創建簡單的用戶交互界面:

另外需要準備一個簡單的數據成員類,方便隨后的演示,

在實例演示前,我們仍舊需要先學習一下Silverlight的Validation數據驗證框架基礎屬性和事件,
首先需要了解的是
[BindingValidationError](http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.bindingvalidationerror(v=VS.95).aspx)事件
該事件是一個路由事件,當數據驗證錯誤出現時,將綁定該錯誤到數據源;也可以簡單的理解為綁定錯誤到數據源的一個行為。該事件可在控件本身調用,也可在其父控件中調用。例如,在TextBox中,可以聲明調用BindingValidationError,或者可以該TextBox的父容器控件Grid,StackPanel中調用BindingValidationError事件。這里需要注意的是,如果在Silverlight的MVVM設計模式下,僅在被驗證的控件本身激活BindingValidationError事件,才能正常的被UI捕獲到錯誤信息,不支持在父控件中對BindingValidationError事件進行調用。
為了保證Validation的靈活性,微軟同時提供了相關屬性,來控制BindingValidationError事件的調用。NotifyOnValidationError和ValidatesOnExceptions屬性。
[NotifyOnValidationError](http://msdn.microsoft.com/en-us/library/system.windows.data.binding.notifyonvalidationerror(VS.95).aspx)屬性
該屬性的功能,是當驗證錯誤出現時是否激活BindingValidationError事件;該屬性是Silverlight獨有的驗證屬性之一,經常和ValidatesOnExceptions屬性配合使用。
[ValidatesOnExceptions](http://msdn.microsoft.com/en-us/library/system.windows.data.binding.validatesonexceptions(v=VS.95).aspx)屬性
該屬性的功能,數據綁定引擎是否捕獲顯示異常錯誤作為驗證錯誤。簡單的理解,在控件綁定數據時,出現數據源異常拋出,或者數據類型轉換時異常拋出,是否作為Validation驗證顯示在客戶端。如果是True,則會按照Validation傳統的處理方式,彈出一個紅色說明標簽,內容是異常錯誤信息,反之,則不捕獲異常作為Validation。
對于Silverlight開發新手而言,初次看到以上概念,會有混淆,請繼續看下面實例,結合實例來理解以上的屬性和事件使用方法。
首先,我們在MainPage中,將我們起初定義的User類添加作為一個靜態數據源,
~~~
xmlns:local="clr-namespace:SilverlightValidationDemo"
~~~
~~~
<UserControl.Resources>
?????????<local:User?x:Key="UserDataContext"/>
?</UserControl.Resources>
~~~
對于控件數據綁定,在Visual Studio中可以通過視圖設定,也可以直接敲入代碼設定,這里,我們使用視圖的方法,減少代碼輸入量,
在MainPage中,選中txtUserName文本框,右鍵選擇屬性,

在屬性框中,設置綁定數據源,

選擇Common - DataContext,然后選擇“Apply Data Binding.." 選擇數據源

這里,數據源可以選擇外部數據源,也可以選擇Element綁定源,我們則使用StaticResource靜態數據源,也就是我們剛才創建的UserDataContext,

選中后,綁定數據源已經完成,則需要設置控件綁定字段設置,選擇Common - Text屬性,

然后選擇 Apply Data Binding...,進入后可以看到,數據源,已經綁定為“DataContext - User”,而數據源中的成員名稱已經被自動列出,

我們需要指定綁定成員名稱,

然后,選擇“Options”,在選項中,選中“NotifyOnValidationError”和“ValidatesOnExceptions”,

這樣控件綁定設置已經完成了,這時,可以切換到Xaml代碼界面查看一下當前txtUserName的代碼可以發現,Visual Studio 2010已經自動生成了綁定代碼,如下:
~~~
<TextBox?x:Name="txtUserName"?Width="200"?DataContext="{Binding?Source={StaticResource?UserDataContext}}"?Text="{Binding?Path=Name,?Mode=TwoWay,?ValidatesOnExceptions=True,?NotifyOnValidationError=True}"?/>
~~~
現在,我們在name數據成員屬性中,添加簡單的判斷代碼:
~~~
??private?string?_name;
??public?string?Name
??{
??????????????get?{?return?_name;?}
??????????????set?
??????????????{
??????????????????if?(string.IsNullOrEmpty(value))
??????????????????{
??????????????????????throw?new?Exception("用戶名不能為空.");
?????????????????}
?????????????????_name?=?value;?
?????????????}
?}
~~~

這樣一個簡單的Validation數據驗證功能就完成了。
大家可以試著將ValidatesOnExceptions=True代碼設為False,看看是否還能捕獲異常驗證?
下面,看看BindingValidationError事件和NotifyOnValidationError屬性的應用,
我們添加一個TextBlock控件,用來顯示驗證異常信息,
~~~
<StackPanel?Orientation="Horizontal"?>
????????<TextBlock?x:Name="tbMessage"?Margin="5"?Foreground="Red"/>
</StackPanel>
~~~
在MainPage中的LayoutRoot布局控件中,添加BindingValidationError事件,
~~~
<Grid?x:Name="LayoutRoot"?Background="White"?BindingValidationError="LayoutRoot_BindingValidationError">
~~~
后臺定義:
~~~
??private?void?LayoutRoot_BindingValidationError(object?sender,?ValidationErrorEventArgs?e)
??{
??????????????if?(e.Action?==?ValidationErrorEventAction.Added)
??????????????{
??????????????????(e.OriginalSource?as?Control).Background?=?new?SolidColorBrush(Colors.Yellow);
??????????????????tbMessage.Text=?e.Error.Exception.Message;
??????????????}
??????????????if?(e.Action?==?ValidationErrorEventAction.Removed) ?????????????{
?????????????????(e.OriginalSource?as?Control).Background?=?new?SolidColorBrush(Colors.White);
?????????????????tbMessage.Text?=?"";
?????????????}
?}
~~~
在驗證異常出現時,由于NotifyOnValidationError屬性設置為True,所以,會執行BindingValidationError事件,
其中tbMessage會顯示驗證錯誤信息,而驗證控件樣式也會有改變。

大家可以試著將NotifyOnValidationError屬性設置為False,會發現BindingValidationError事件將不再執行。
今天,就講到這里了。本篇講述的兩個屬性和一個事件,是Silverlight的Validation最基礎的知識點,在隨后的文章中會頻繁出現,希望大家能夠認真理解。
[源代碼下載](http://www.silverlightchina.net/uploads/soft/100908/1-100ZQ44358.rar)
歡迎大家加入"專注Silverlight" 技術討論群:
32679955(六群)
23413513(五群)
32679922(四群)
100844510(三群)
37891947(二群)
22308706(一群)
?
- 前言
- 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導航框架傳遞參數