除了上一節講的型別轉換器,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類獲取錯誤資訊,我們也可以將兩個方法融合為一個,程式碼如下:
效果都是一樣的。