除了上一節講的類型轉換器,Binding還自帶數據校驗功能,這節主要來講一下。
跟類型轉換器一樣,數據校驗需要我們繼承ValidationRule類,實現其中的Validate方法,並寫入我們自定義的邏輯來完成校驗規則的制定,下面以文本框只能錄入數字的校驗規則來演示一下它的使用,請先看數據校驗的處理邏輯:
class NumberValidationRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { if(int.TryParse(value.ToString(), out int defaultVal)) { return new ValidationResult(true, null); } else { //第二個參數是錯誤描述信息 return new ValidationResult(false, "Invalid Number"); } } }
整體的代碼很簡單,它的返回值是統一的ValidationResult 類型, 驗證出錯后可以返回一些錯誤描述性數據。
然后在后台將數據驗證的Binding設置到文本框(文本框名為txBox)中:

當數據為正常的數字時,校驗通過,文本框無變化,當輸入非數字時,效果如下:

文本框自動變紅。
另外要了解一點,Binding的ValidationRules是個集合,也就是可以設置多個數據校驗。
一般的,系統默認從源,也就是后台屬性中來的數據都是合法的,也就是不自動校驗從源來的數據,如下圖:

如果需要校驗來自源的數據,需要做點改動,如下圖:

將校驗對象的ValidatesOnTargetUpdated屬性設置為true。
另外,我們看到,界面上並沒有顯示錯誤信息,這一點需要我們做一些特殊處理,我修改了一下布局:

在文本框下添加了一個用於顯示錯誤信息的TextBlock,並添加了兩個事件,一個是驗證錯誤時觸發的Validation.Error事件,用於顯示錯誤信息,一個是TextChanged事件,用於校驗正確后清除錯誤信息,后台代碼如下:

從事件參數中我們就能拿到錯誤對象,通過該對象的ErrorContent屬性就能拿到錯誤信息。同時,我們也可以通過Validation類來獲取錯誤數據,GetErrors方法可以獲取到錯誤數量,當沒有錯誤時,應該清掉錯誤信息,效果如下:


既然可以通過Validation類獲取錯誤信息,我們也可以將兩個方法融合為一個,代碼如下:

效果都是一樣的。

