程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WPF中數據綁定的Validation應用分析

WPF中數據綁定的Validation應用分析

編輯:關於.NET

本來在寫WPF Bug清單系列,但是寫到第三篇(突然消失的ListViewItem)的時候發現重現BUG的邏輯 很復雜。而且需要比較多的基礎知識,如果不先解釋清楚,實在是怕有人用“不用Valiation不就行了” 等回復來砸場子。^_^

本文從設計和應用的角度對DataBinding的Validation的不足進行了分析,假設讀者使用過 DataBinding中的Validation。著重介紹WPF中DataBinding的Validation。有關數據綁定的基礎知識請參 考MSDN。

有的人很不歡喜用Data Binding,無論是WPF還是WinForm的。認為自己控制數據同步更新不就好了? 如果只是一個登錄框或是寫著玩的程序,也絕對沒有什麼問題。但是如果是在具有大量分層次的數據結構 的企業級程序中,手動地進行UI與後台數據的更新,不僅工作量繁重,而且容易出錯。(WPF固然有很多 BUG,但是我們也不應該因此不用吧。)

多數情況下,由ValiationRule繼承來的簡單Rule可以完成多數數據綁定的驗證。比如 StringRequiredRule,LengthContraintRule,RegexValidationRule等等,在CodePlex上已經存在這樣一 個簡單Rule庫的項目。(讓人詫異的是這個沒幾行代碼的東西還在Beta)

但是對於稍稍復雜一點的Validation,一般的ValidationRule就無能為力了。

比如下面的Person類。

  public class Person
  {
    public int MaxAge = 1000;
    public int MinAge = 0;
    public int Age { get; set; }
  }

這時,要驗證Age,就要取到MaxAge和MinAge的值。但是這個值在.NET Framework 3.0的 ValidationRule裡是取不到的(3.5 SP1中可在BindingGroup的Validation中取到)。這還只是在兄弟屬 性裡找,如果Person有個Parent屬性,我們要驗證Parent是否存在,就要獲取到所有的Person。

這時我們就要祭出.NET Framework 3.5引入的DataErrorValidationRule或是.NET Framework 3.5 SP1 引入的BindingGroup。(未發布的.NET Framework 4.0其實才能算是WPF的完整版,其中加入了多個重要 組件。)

PS:面對3.0、3.5的簡陋,不想頻繁跟進.NET的更新都不行。(或者說新版更誘人好聽些)

簡單起見,本篇將著重介紹DataErrorValidationRule ,畢竟其所依賴的IDataErrorInfo接口早 在.NET Framework 1.0中就已經存在。如果遺留系統中的數據定義已經使用這個接口進行數據的驗證,那 麼通過DataErrorValidationRule移植到WPF也是會帶來一定方便的。(如果真要移的話。)

使用IDataErrorInfo接口,簡單點,直接實現這個接口就可以了,但是會讓這個類非常的臃腫;因為 這樣會把一堆數據驗證邏輯寫在數據類中。我們知道,類的功能應該單一,所以我們就需要建立一整套類 來進行數據驗證。把驗證邏輯獨立出來。這個是與主題無關的設計問題,就不在這裡深入討論了。在使用 數據驗證時,我們不得不面對如下幾個事實。

1.一些情況下,一個數據更改(比如刪除一個數據項),可能會產生多個驗證錯誤。所以就需要維護 一個當前Errors列表。然後,一系列針對這個列表的CRUD操作隨之而來。這個也還好。主要問題是下面的 。

2.數據驗證的邏輯是針對數據類的,就是這個類的每個實例都應該有相同或類似的驗證邏輯。但是, Data Binding的Validation是針對數據實例的。針對數據實例沒有什麼問題。但是也許是為了節省內存, WPF的實現導致了Validation使用上的一個不便——UI上不可見的控件,是不會自動地做Validation的。

3.因為事實2的存在,我們會手動的去對數據進行Validation。問題又來了,手動地Validation,UI層 不知道啊。出了錯,UI也不會根據ErrorTemplate自動更改UI(比如自動地顯示紅框出來)。如何讓UI知 道它出錯了呢?一個方法是觸發相應的PropertyChanged事件。

4.一部分的BusinessObject具有IsDirty屬性(參見CSLA.NET框架),用來標識這個對象有沒有發生過 變化。有時就會用PropertyChanged事件來對IsDirty屬性進行操作。而這又與3中的解決方案沖突……一 系列問題都出來了。

關於上面的問題本來想寫一個帶有示例的WPF Bug列表文章。但是其實這個不是WPF的Bug,只是使用上 的不方便的地方(非常不便)。所以單獨寫了一篇解釋一下。希望能給使用或將要使用WPF中Validation 的朋友們一些提示。

由於時間所限,很多內容沒有展開,只是點到而已。如果有寫得太不像話的地方——不要客氣。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved