上篇介紹了Silverlight的Validation數(shù)據(jù)驗(yàn)證的好處和概述,其中了解到Silverlight數(shù)據(jù)驗(yàn)證方法可以被抽象為語(yǔ)法驗(yàn)證和語(yǔ)義驗(yàn)證,其中前者是通過(guò)數(shù)據(jù)類(lèi)型定義對(duì)比驗(yàn)證,而后者是通過(guò)當(dāng)前輸入數(shù)據(jù)根據(jù)特定數(shù)據(jù)限制代碼進(jìn)行驗(yàn)證。本篇將在以上抽象方法的基礎(chǔ)上結(jié)合實(shí)例,介紹Silverlight Validation數(shù)據(jù)驗(yàn)證類(lèi)中常用屬性和方法。
本篇,我們將創(chuàng)建一個(gè)新的實(shí)例項(xiàng)目,SilverlightValidationDemo
在MainPage,創(chuàng)建簡(jiǎn)單的用戶交互界面:
另外需要準(zhǔn)備一個(gè)簡(jiǎn)單的數(shù)據(jù)成員類(lèi),方便隨后的演示,
在實(shí)例演示前,我們?nèi)耘f需要先學(xué)習(xí)一下Silverlight的Validation數(shù)據(jù)驗(yàn)證框架基礎(chǔ)屬性和事件, 首先需要了解的是
該事件是一個(gè)路由事件,當(dāng)數(shù)據(jù)驗(yàn)證錯(cuò)誤出現(xiàn)時(shí),將綁定該錯(cuò)誤到數(shù)據(jù)源;也可以簡(jiǎn)單的理解為綁定錯(cuò)誤到數(shù)據(jù)源的一個(gè)行為。該事件可在控件本身調(diào)用,也可在其父控件中調(diào)用。例如,在TextBox中,可以聲明調(diào)用BindingValidationError,或者可以該TextBox的父容器控件Grid,StackPanel中調(diào)用BindingValidationError事件。這里需要注意的是,如果在Silverlight的MVVM設(shè)計(jì)模式下,僅在被驗(yàn)證的控件本身激活BindingValidationError事件,才能正常的被UI捕獲到錯(cuò)誤信息,不支持在父控件中對(duì)BindingValidationError事件進(jìn)行調(diào)用。
為了保證Validation的靈活性,微軟同時(shí)提供了相關(guān)屬性,來(lái)控制BindingValidationError事件的調(diào)用。NotifyOnValidationError和ValidatesOnExceptions屬性。
該屬性的功能,是當(dāng)驗(yàn)證錯(cuò)誤出現(xiàn)時(shí)是否激活BindingValidationError事件;該屬性是Silverlight獨(dú)有的驗(yàn)證屬性之一,經(jīng)常和ValidatesOnExceptions屬性配合使用。
該屬性的功能,數(shù)據(jù)綁定引擎是否捕獲顯示異常錯(cuò)誤作為驗(yàn)證錯(cuò)誤。簡(jiǎn)單的理解,在控件綁定數(shù)據(jù)時(shí),出現(xiàn)數(shù)據(jù)源異常拋出,或者數(shù)據(jù)類(lèi)型轉(zhuǎn)換時(shí)異常拋出,是否作為Validation驗(yàn)證顯示在客戶端。如果是True,則會(huì)按照Validation傳統(tǒng)的處理方式,彈出一個(gè)紅色說(shuō)明標(biāo)簽,內(nèi)容是異常錯(cuò)誤信息,反之,則不捕獲異常作為Validation。
對(duì)于Silverlight開(kāi)發(fā)新手而言,初次看到以上概念,會(huì)有混淆,請(qǐng)繼續(xù)看下面實(shí)例,結(jié)合實(shí)例來(lái)理解以上的屬性和事件使用方法。
首先,我們?cè)贛ainPage中,將我們起初定義的User類(lèi)添加作為一個(gè)靜態(tài)數(shù)據(jù)源,
2 <local:User x:Key="UserDataContext"/> 3 </UserControl.Resources>
對(duì)于控件數(shù)據(jù)綁定,在Visual Studio中可以通過(guò)視圖設(shè)定,也可以直接敲入代碼設(shè)定,這里,我們使用視圖的方法,減少代碼輸入量, 在MainPage中,選中txtUserName文本框,右鍵選擇屬性,
在屬性框中,設(shè)置綁定數(shù)據(jù)源,
選擇Common - DataContext,然后選擇“Apply Data Binding.." 選擇數(shù)據(jù)源
這里,數(shù)據(jù)源可以選擇外部數(shù)據(jù)源,也可以選擇Element綁定源,我們則使用StaticResource靜態(tài)數(shù)據(jù)源,也就是我們剛才創(chuàng)建的UserDataContext,
選中后,綁定數(shù)據(jù)源已經(jīng)完成,則需要設(shè)置控件綁定字段設(shè)置,選擇Common - Text屬性,
然后選擇 Apply Data Binding...,進(jìn)入后可以看到,數(shù)據(jù)源,已經(jīng)綁定為“DataContext - User”,而數(shù)據(jù)源中的成員名稱已經(jīng)被自動(dòng)列出,
我們需要指定綁定成員名稱,
然后,選擇“Options”,在選項(xiàng)中,選中“NotifyOnValidationError”和“ValidatesOnExceptions”,
這樣控件綁定設(shè)置已經(jīng)完成了,這時(shí),可以切換到Xaml代碼界面查看一下當(dāng)前txtUserName的代碼可以發(fā)現(xiàn),Visual Studio 2010已經(jīng)自動(dòng)生成了綁定代碼,如下:
現(xiàn)在,我們?cè)趎ame數(shù)據(jù)成員屬性中,添加簡(jiǎn)單的判斷代碼:
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 }
這樣一個(gè)簡(jiǎn)單的Validation數(shù)據(jù)驗(yàn)證功能就完成了。 大家可以試著將ValidatesOnExceptions=True代碼設(shè)為False,看看是否還能捕獲異常驗(yàn)證? 下面,看看BindingValidationError事件和NotifyOnValidationError屬性的應(yīng)用, 我們添加一個(gè)TextBlock控件,用來(lái)顯示驗(yàn)證異常信息,
2 <TextBlock x:Name="tbMessage" Margin="5" Foreground="Red"/> 3 </StackPanel>
在MainPage中的LayoutRoot布局控件中,添加BindingValidationError事件,
后臺(tái)定義:
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 }
在驗(yàn)證異常出現(xiàn)時(shí),由于NotifyOnValidationError屬性設(shè)置為T(mén)rue,所以,會(huì)執(zhí)行BindingValidationError事件,
其中tbMessage會(huì)顯示驗(yàn)證錯(cuò)誤信息,而驗(yàn)證控件樣式也會(huì)有改變。
![]() 大家可以試著將NotifyOnValidationError屬性設(shè)置為False,會(huì)發(fā)現(xiàn)BindingValidationError事件將不再執(zhí)行。
今天,就講到這里了。本篇講述的兩個(gè)屬性和一個(gè)事件,是Silverlight的Validation最基礎(chǔ)的知識(shí)點(diǎn),在隨后的文章中會(huì)頻繁出現(xiàn),希望大家能夠認(rèn)真理解。
源代碼下載地址:
|
|