Silverlight Validation驗證實例教程系列已經寫了七篇 了, 今天將完成計劃中的最後一個話題,創建自定義擴展驗證類,本篇是根據一些讀者反饋的問題總結而來的,在本篇最後,將簡單的對目前Silverlight Validation驗證框架提供的驗證機制進行總結性的對比和歸納,希望能夠幫助大家在實際項目中定位和應用驗證框架。
閱讀過前幾篇Silverlight實例教程的朋友,給我留言和來信,大家對於Silverlight Validation類的使用,總感覺有些不靈活,特別是在自定義使用時,很難輕鬆的控制錯誤驗證的捕獲和彈出。 下面,我將演示另外一個實例,該實例將幫助開發人員創建自定義擴展Validation類,該類允許開發人員,方便的控制驗證錯誤彈出,驗證錯誤清除,以 及驗證校驗方法。
Silverlight Validation自定義擴展類
本實例仍舊使用SilverlightValidationDemo項目,在Mainpage中創建一個簡單的UI,進行演示:
< StackPanel Orientation ="Horizontal" Margin ="5" >
< TextBlock Text ="產品名: " VerticalAlignment ="Center" />
< TextBox x:Name ="txtProduct" Width ="200" />
</ StackPanel >
< StackPanel Orientation ="Horizontal" Margin ="5" >
< TextBlock Text ="數 量: " VerticalAlignment ="Center" />
< TextBox x:Name ="txtAmount" Width ="200" />
</ StackPanel >
< StackPanel Orientation ="Horizontal" Margin ="5" >
< TextBlock Text ="單 價: " VerticalAlignment ="Center" />
< TextBox x:Name ="txtPrice" Width ="200" />
</ StackPanel >
< StackPanel Orientation ="Horizontal" >
< Button x:Name ="btBuy" Content ="購 買" Margin ="5" />
< Button x:Name ="btReset" Content ="重 置" Margin ="5" />
</ StackPanel >
</ StackPanel >
根據上圖,我們看到,我們將對產品名,產品數量和產品單價進行驗證,在Xaml代碼中,沒有對Text進行綁定,這些,我們將在代碼中進行實現。
在完成上面UI的創建,我們需要創建一個靜態類ValidationExtension,在該類中,我們將創建自定義驗證方法,以及驗證錯誤信息控制方法。
在ValidationExtension類中,我們將使用以下三個靜態方法,接管Silverlight Validation默認的驗證捕獲,其代碼分別是:
{
CustomizeValidation customValidation = new CustomizeValidation(message);
Binding binding = new Binding( " ValidationError " )
{
Mode = System.Windows.Data.BindingMode.TwoWay,
NotifyOnValidationError = true ,
ValidatesOnExceptions = true ,
Source = customValidation
};
frameworkElement.SetBinding(Control.TagProperty, binding);
}
SetValidation靜態方法,將設置FrameworkElement元素綁定ValidationError驗證錯誤信息,其中設置 NotifyOnValidationError 和ValidatesOnExceptions 爲True,允許控件對異常和驗證錯誤進行捕獲和反饋。
{
BindingExpression b = frameworkElement.GetBindingExpression(Control.TagProperty);
if (b != null )
{
((CustomizeValidation)b.DataItem).ShowErrorMessage = true ;
b.UpdateSource();
}
}
RaiseValidationError靜態方法,在驗證錯誤綁定後,通過該方法將錯誤異常顯示在客戶端,通過UpdateSource方法更新客戶端錯誤異常顯示。簡單的理解就是在客戶端控件對象,彈出異常錯誤提示信息。
{
BindingExpression b = frameworkElement.GetBindingExpression(Control.TagProperty);
if (b != null )
{
((CustomizeValidation)b.DataItem).ShowErrorMessage = false ;
b.UpdateSource();
}
}
ClearValidationError靜態方法,和RaiseValidationError靜態方法正好相反,調用該方法將清空當前對象上顯示的異常錯誤信息。
以上三個方法的調用,將在後文演示。下面需要添加簡單的驗證條件,幫助客戶端捕獲驗證錯誤信息,爲了方便起見,這裏,創建了對數字的判斷和對雙精度型的數據判斷,代碼如下:
{
bool isNumberValid = true ;
int number = - 1 ;
if ( ! Int32.TryParse(inputNumber, out number))
{
isNumberValid = false ;
}
return isNumberValid;
}
IsNumberValid靜態方法,判斷當前對象中輸入字符是否爲數字;
{
bool isPriceValid = true ;
double minprice = 8.8 ;
if (Convert.ToDouble(inputPrice) < minprice)
{
isPriceValid = false ;
}
return isPriceValid;
}
IsPriceValid靜態方法,判斷當前對象中輸入字符是否大於最小价格,如果False,則返回驗證錯誤。
這裏大家已經留意到,ValidationExtension自定義擴展類沒有繼承和實現任何驗證類或接口,獨立存在。
在以上靜態方法中,我們用到了CustomizeValidation自定義驗證類中的屬性成員,在過去的幾篇中,我們僅在CustomizeValidation中定義了一個簡單的自定義驗證方法,而現在我們需要添加兩個簡單的屬性和一個新的構造函數,其代碼如下:
private string message;
#endregion
#region Public Property
public bool ShowErrorMessage
{
get ;
set ;
}
public object ValidationError
{
get
{
return null ;
}
set
{
if (ShowErrorMessage)
{
throw new ValidationException(message);
}
}
}
#endregion
構造函數:
{
this .message = message;
}
其目的是爲了收集驗證錯誤信息。
完成了以上自定義代碼後,我們可以在客戶端進行簡單的調用代碼設置:
目前,我們希望,點擊“購買”按鈕後,對用戶輸入信息進行驗證判斷,如果有錯誤異常,則彈出驗證錯誤信息,
這裏我們僅需要添加部分代碼到btBuy.Click事件即可。
private void btBuy_Click( object sender, RoutedEventArgs e)
{
bool isValid = true ;
txtProduct.ClearValidationError();
txtAmount.ClearValidationError();
txtPrice.ClearValidationError();
if (txtProduct.Text == "" )
{
txtProduct.SetValidation( " 請輸入產品名稱 " );
txtProduct.RaiseValidationError();
isValid = false ;
}
if (txtAmount.Text == "" || ! txtAmount.Text.IsNumberValid())
{
txtAmount.SetValidation( " 請輸入一個整數 " );
txtAmount.RaiseValidationError();
isValid = false ;
}
if (txtPrice.Text == "" || ! txtPrice.Text.IsPriceValid())
{
txtPrice.SetValidation( " 最小出價8.8 " );
txtPrice.RaiseValidationError();
isValid = false ;
}
if (isValid)
{
HtmlPage.Window.Alert( " 產品購買成功 " );
ResetForm();
}
}
private void btReset_Click( object sender, RoutedEventArgs e)
{
ResetForm();
}
private void ResetForm()
{
txtProduct.ClearValidationError();
txtAmount.ClearValidationError();
txtPrice.ClearValidationError();
txtProduct.Text = "" ;
txtAmount.Text = "" ;
txtPrice.Text = "" ;
}
#endregion
通過SetValidation,設置驗證錯誤提示信息,通過RaiseValidationError彈出驗證錯誤信息,每次點擊前,調用ClearValidationError清空當前驗證錯誤。最終執行結果如下:
到這裏,我們已經完成了一個自定義擴展Validation類,大家可以根據這個思路擴展更多的驗證校驗方法,並應用到項目控件中。
Silverlight Validation驗證機制對比總結和建議
在過去的幾篇中,我們曾經詳細介紹了四種Silverlight Validation驗證機制,分別是
- 基本異常驗證機制;
- DataAnnotation驗證機制;
- IDataErrorInfo客戶端同步驗證機制;
- INotifyDataErrorInfo服務器端異步驗證機制;
一些朋友發郵件問我,這些驗證機制在項目中的優勢是什麼?在實際項目中,如何選擇適當的驗證機制?下面有個簡單的列表,將以上四種驗證機制進行簡單的歸納總結:
驗證機制 |
優勢 |
劣勢 |
基本異常驗證機制 |
1. 適用任何數據類型驗證; 2. 使用方法簡單,僅需在Xaml代碼中設置即可; |
1. 只能在屬性Setter中使用; 2. 不支持自定義方法驗證 3. 每個成員每次僅能捕獲一個驗證錯誤 |
DataAnnotation驗證機制 |
1. 不會引發異常錯誤; 2. 每個成員可以使用多個驗證條件; 3. 使用方法簡單,僅需聲明屬性即可;無需過多編寫代碼; 4. 支持自定義方法驗證; |
僅適合用於Datagrid和Dataform和一些可使用DataAnnotation屬性的第三方控件 |
IDataErrorInfo客戶端同步驗證機制 |
1. 不會引發異常錯誤; 2. 支持自定義方法驗證; |
1. 不能捕獲數據類型驗證錯誤; 2. 每個數據成員每次僅能捕獲一個驗證錯誤; 3. 使用方法較爲複雜; |
INotifyDataErrorInfo服務器端異步驗證機制 |
1. 不會引發異常錯誤; 2. 支持自定義方法驗證; 3. 支持服務器端異步驗證; 4. 每個成員可以使用多個驗證條件; |
1. 不能捕獲數據類型驗證錯誤; 2. 多條件驗證下,僅支持顯示第一個驗證錯誤; 3. 使用方法複雜; |
在使用Silverlight Validation框架是需要注意以下幾點:
1. 使項目支持異常捕獲,這樣驗證框架可支持數據類型校驗;
2. 如果使用Datagrid和Dataform控件,推薦使用DataAnnotation驗證機制;
3. 如果需要在客戶端驗證所有信息,推薦使用IDataErrorInfo驗證機制;
4. 如果需要使用服務器端的驗證方法,推薦使用INotifyDataErrorInfo驗證機制。
相信大家在明白了以上各個驗證機制的優勢和劣勢後,已經可以輕鬆掌握Silverlight Validation驗證框架的應用了。
Silverlight Validation實例教程系列,到這裏即將完結,如果大家在閱讀中,或者項目中遇到問題或者有不同的意見,
歡迎留言給我,我們一起討論學習。
最後感謝每一位支持的朋友。