數據綁定-驗證(二)

在數據綁定時,還有一項工做,就是數據的驗證。ide

在上一篇博文中,文本框來顯示person對象的年齡,咱們知道,由於年齡是數據,在輸入非數字時,必定是不符合現實意義的。在WPF中,對數據的綁定,特別是雙向綁定,數據目標屬性更新數據源屬性時,進行數據驗證,道先,若是給一個綁定目標屬性加入驗證,必需用屬性元素語法來達到目的,就是給Binding屬性添加一個<Binding.ValudationRules>,再添加一個<ExceptionValidationRule>的子標籤,同時把<Binding>標籤的NotifyOnValidationError的屬性設置成true,這樣,後臺的驗證代碼才起做用(由於默認狀況下NotifyOnValidationError是 false)雙向綁定

<TextBox Height="23" Margin="12,31,0,0" Name="textBox1" ;120" >orm

<TextBox.Text>對象

<Binding Path="Age" Mode="TwoWay" NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged">繼承

<Binding.ValidationRules>string

<ExceptionValidationRule>it

</ExceptionValidationRule>io

</Binding.ValidationRules>class

</Binding>後臺

</TextBox.Text>

</TextBox>

上面XAML代碼與下面代碼功能相同:

Binding bd = new Binding("Age");

bd.Mode = BindingMode.TwoWay;

bd.NotifyOnValidationError = true;

bd.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

ValidationRule vr = new ExceptionValidationRule();

bd.ValidationRules.Add(vr);

textBox1.SetBinding(TextBox.TextProperty, bd);

而後把驗證失敗後的執行操做代碼,關聯起來,以下:

Validation.AddErrorHandler(textBox1, valite);

//下面是驗證失敗後的代碼。

public void valite(object sender, ValidationErrorEventArgs e)

{

if (e.Action == ValidationErrorEventAction.Added)

{

MessageBox.Show((string)e.Error.ErrorContent, "驗¨|證?è錯?¨a誤¨?!ê?");

}

}

在驗證數據時,咱們用的是系統自定義的驗證類ValidationRule,這個類是個抽象類,目前的版本微軟提供了兩個子類來實現它,一個是ExceptionValidationRule,另外一個是DataErrorValidationRule,前者是捕獲在綁定目標屬性把數據更新回綁定源屬性時的異常,後者是檢查綁定源提供用戶界面能夠綁定的自定義錯誤信息。本例子中,用的是ExceptionValidationRule,實際上就是把一些非int類型的數值給person.Age賦值時,觸發異常,ExceptionValidationRule就捕獲到異常,從而經過Validation.AddErrorHandler來報出異常。

另外,即然ValidationRule是抽象類,ExceptionValidationRule和DataErrorValidationRule都是繼承它來的,能不能咱們也定義一個類去繼承ValidationRule,來完成本身的驗證呢,答案是確定的,就拿上面的例子來講Age,通常是在0到150之間(人的年齡通常沒有負的,人的年齡指活的時長,也就是人最多活150歲,這個值已經至關對得起活着的人了),那就能夠自定義一個類,繼承ValidationRule,來實現這個年齡範圍的業務。

首先來定義這個類:

public class ValidationAge:ValidationRule

{

public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)

{

int age;

if (!int.TryParse(value.ToString(), out age))

{

return new ValidationResult(false, "年齡類型不正確!");

}

else

{

if (age < 0 || age > 150)

{

return new ValidationResult(false, "不符合人類的年齡(0-150)!");

}

else

{

return new ValidationResult(true, null);

}

}

}

}

XAML代碼以下:

<TextBox Height="23" Margin="12,31,0,0" Name="textBox1" ;120" >

<TextBox.Text>

<Binding Path="Age" Mode="TwoWay" NotifyOnValidationError="True" UpdateSourceTrigger="PropertyChanged">

<Binding.ValidationRules>

<m:ValidationAge>

</m:ValidationAge>

</Binding.ValidationRules>

</Binding>

</TextBox.Text>

</TextBox>

或用代碼實現:

Binding bd = new Binding("Age");

bd.Mode = BindingMode.TwoWay;

bd.NotifyOnValidationError = true;

bd.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

ValidationRule vr = new ValidationAge();

bd.ValidationRules.Add(vr);

textBox1.SetBinding(TextBox.TextProperty, bd);

若是拋開WPF綁定這個概念,上面所作的工做就是從UI的值往對象中回寫的時候,若是不符合要求,就拋出異常,在 WinForm中,咱們一般是給類的屬性設置這些驗證,就是在Person類的Age屬性Set訪問器中驗證Value的有效性,固然,這種作完在WPF中也有效,相經較之下,這種作法還較簡單。其實WPF中的這種作法,本質是同樣的,就在是調用Person類的Age的Set訪問器前,加了一個驗證。

還有一點要注意的是在驗證方法valite中,ValidationErrorEventArgs參數有一個Action的屬性,這個屬性是個枚舉值,有兩個枚舉值,Added和Removed,若是不做處理,當咱們輸入一個非數字的值時,理所固然報錯,但當咱們刪除這個值時也報錯,就是由於才望高驗證的觸發是驗證值的改變,添加和刪除(沒有修改,由於修改是一個刪除+添加的過程),因此爲了不出來兩次驗證,就做了一下處理,只驗證Action爲Added的。

再有一點就是,若是綁定不作自定義驗證VlidationAge,而是用ExceptionValidationRule,文本框與年齡綁定,由於年齡是整型,若是在文本框中輸和e或E,都會轉化成科學講學法的,這點要注意。

相關文章
相關標籤/搜索