Silverlight輸入數據驗證系列-

Silverlight實例教程 - Validation數據驗證基礎屬性和事件

時間:2010-09-08 14:41來源:SilverlightChina.Net 作者:Jv9 點擊: 367次
上篇介紹了Silverlight的Validation數據驗證的好處和概述,其中瞭解到Silverlight數據驗證方法可以被抽象爲語法驗證和語義驗證,其中前者是通過數據類型定義對比驗證,而後者是通過當前輸入數據根據特定數據限制代碼進行驗證。本篇將在以上抽象方法的基礎上結合實例,介
  

 

 

上篇介紹了Silverlight的Validation數據驗證的好處和概述,其中瞭解到Silverlight數據驗證方法可以被抽象爲語法驗證和語義驗證,其中前者是通過數據類型定義對比驗證,而後者是通過當前輸入數據根據特定數據限制代碼進行驗證。本篇將在以上抽象方法的基礎上結合實例,介紹Silverlight Validation數據驗證類中常用屬性和方法。

 

本篇,我們將創建一個新的實例項目,SilverlightValidationDemo

 

 

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

 

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

 

在實例演示前,我們仍舊需要先學習一下Silverlight的Validation數據驗證框架基礎屬性和事件,

首先需要了解的是

 

BindingValidationError事件

該事件是一個路由事件,當數據驗證錯誤出現時,將綁定該錯誤到數據源;也可以簡單的理解爲綁定錯誤到數據源的一個行爲。該事件可在控件本身調用,也可在其父控件中調用。例如,在TextBox中,可以聲明調用BindingValidationError,或者可以該TextBox的父容器控件Grid,StackPanel中調用BindingValidationError事件。這裏需要注意的是,如果在Silverlight的MVVM設計模式下,僅在被驗證的控件本身激活BindingValidationError事件,才能正常的被UI捕獲到錯誤信息,不支持在父控件中對BindingValidationError事件進行調用。

 

爲了保證Validation的靈活性,微軟同時提供了相關屬性,來控制BindingValidationError事件的調用。NotifyOnValidationError和ValidatesOnExceptions屬性。

 

NotifyOnValidationError屬性

該屬性的功能,是當驗證錯誤出現時是否激活BindingValidationError事件;該屬性是Silverlight獨有的驗證屬性之一,經常和ValidatesOnExceptions屬性配合使用。

 

ValidatesOnExceptions屬性

該屬性的功能,數據綁定引擎是否捕獲顯示異常錯誤作爲驗證錯誤。簡單的理解,在控件綁定數據時,出現數據源異常拋出,或者數據類型轉換時異常拋出,是否作爲Validation驗證顯示在客戶端。如果是True,則會按照Validation傳統的處理方式,彈出一個紅色說明標籤,內容是異常錯誤信息,反之,則不捕獲異常作爲Validation。

 

對於Silverlight開發新手而言,初次看到以上概念,會有混淆,請繼續看下面實例,結合實例來理解以上的屬性和事件使用方法。

 

首先,我們在MainPage中,將我們起初定義的User類添加作爲一個靜態數據源,

 

1 xmlns:local="clr-namespace:SilverlightValidationDemo"

 

 

1 <UserControl.Resources>
2         <local:User x:Key="UserDataContext"/>
3 </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已經自動生成了綁定代碼,如下:

 

1 <TextBox x:Name="txtUserName" Width="200" DataContext="{Binding Source={StaticResource UserDataContext}}" Text="{Binding Path=Name, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" />

 

 

現在,我們在name數據成員屬性中,添加簡單的判斷代碼:

 

 1 private string _name;
 2 public string Name
 3 {
 4             get { return _name; }
 5             set 
 6             {
 7                 if (string.IsNullOrEmpty(value))
 8                 {
 9                     throw new Exception("用戶名不能爲空.");
10                 }
11                 _name = value; 
12             }
13 }

 

 

 

 

這樣一個簡單的Validation數據驗證功能就完成了。

大家可以試着將ValidatesOnExceptions=True代碼設爲False,看看是否還能捕獲異常驗證?

下面,看看BindingValidationError事件和NotifyOnValidationError屬性的應用,

我們添加一個TextBlock控件,用來顯示驗證異常信息,

 

1 <StackPanel Orientation="Horizontal" >
2        <TextBlock x:Name="tbMessage" Margin="5" Foreground="Red"/>
3 </StackPanel>

 

 

在MainPage中的LayoutRoot佈局控件中,添加BindingValidationError事件,

 

1 <Grid x:Name="LayoutRoot" Background="White" BindingValidationError="LayoutRoot_BindingValidationError">

 

 

後臺定義:

 

 1 private void LayoutRoot_BindingValidationError(object sender, ValidationErrorEventArgs e)
 2 {
 3             if (e.Action == ValidationErrorEventAction.Added)
 4             {
 5                 (e.OriginalSource as Control).Background = new SolidColorBrush(Colors.Yellow);
 6                 tbMessage.Text= e.Error.Exception.Message;
 7             }
 8 
 9             if (e.Action == ValidationErrorEventAction.Removed)
10             {
11                 (e.OriginalSource as Control).Background = new SolidColorBrush(Colors.White);
12                 tbMessage.Text = "";
13             }
14 }

 

 

在驗證異常出現時,由於NotifyOnValidationError屬性設置爲True,所以,會執行BindingValidationError事件,
其中tbMessage會顯示驗證錯誤信息,而驗證控件樣式也會有改變。
 
大家可以試着將NotifyOnValidationError屬性設置爲False,會發現BindingValidationError事件將不再執行。
 
今天,就講到這裏了。本篇講述的兩個屬性和一個事件,是Silverlight的Validation最基礎的知識點,在隨後的文章中會頻繁出現,希望大家能夠認真理解。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章