WPF - Validation ValidationRule và Vấn Đề Về Thông Báo Lỗi Trực Quan Phần II


Ở phần trước chúng ta đã biết về Validation với Interface IDataErrorInfo, ở phần này tôi sẽ nói về phần còn lại của Validation đó là ValidationRule. Hiểu nôm na đó là cách tạo một tập các điều luật quy định việc nhập liệu của người dùng (có thể là miền giá trị cho phép ở ví dụ dưới)




Tôi tiếp tục lấy ví dụ ở phần trước và chỉ thêm mới lớp PersionalRules. chúng ta đã tìm hiểu về interface IDataErrorInfo, bây giờ chúng ta tìm hiểu về class ValidationRule, lớp này có duy  nhất một hàm thành viên




[code language="csharp"]
public override ValidationResult Validate(object value,
System.Globalization.CultureInfo cultureInfo){}
[/code]

Tôi tiếp tục thêm vào class PersionalRules hai thuộc tính đó là MinMax đại diện cho miền giá trị về tuổi (Min < x < Max), tôi override phương thức Validate và tôi nhận được kết quả




[code language="csharp"]
class PersionalRules : ValidationRule
{
public int Min { set; get; }
public int Max { set; get; }

public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
int YearOld = 0;
try
{
if (((string)value).Length > 0)
YearOld = Int32.Parse((String)value);
}
catch (Exception e)
{
return new ValidationResult(false, "Giá trị nhập vào không phải là số" + e.Message);
}

if ((YearOld < Min) || (YearOld > Max))
{
return new ValidationResult(false,
"Độ tuổi vượt quá giới hạn cho phép " + Min + " - " + Max + ".");
}
else
{
//Tất cả đều hợp lệ
return new ValidationResult(true, null);
}
}
}
[/code]

Quay lại phần GUI(giao diện) chúng ta dùng lại ví dụ trước và thêm thế này (chú ý là chỉ thêm một dòng "xmlns:Rules="clr-namespace:Validation" thôi ở thẻ Window)




[code language="xml"]
<Window x:Class="Validation.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Rules="clr-namespace:Validation" <!--Namespace chứa class PersionalRules-->
Title="MainWindow" Height="250" Width="525">
[/code]

Tiếp theo đến thẻ TextBox của tuổi chúng ta thay bằng thẻ TextBox mới như sau(Chú ý thẻ được thêm vào và xóa property Text của thể TextBox cũ)




[code language="xml"]
<TextBox x:Name="txtYear" Height="23" TextWrapping="Wrap" Tag="Year-Old"
<!--Xóa thuộc tính Text=" " ở đây-->
VerticalAlignment="Top" Padding="5,1,2,1" Style="{DynamicResource TxtStyleValidation}"
BorderBrush="#FF0630AE" Margin="0,3,0,0">
<!--Phần thêm vào-->
<TextBox.Text>
<Binding Path="YearOld" UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<!--Giá trị Min,Max là một hằng số, giá trị của chúng không thể dùng Binding-->
<Rules:PersionalRules Min="18" Max="30"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
<!--Phần thêm vào-->
</TextBox>
[/code]

Kết quả như sau (SourceCode)




[caption id="" align="aligncenter" width="525"]tuanphamdg Phạm Tuân[/caption]

Chúng ta đã hoàn thành hai vấn đề về Validation, chúc các bạn thành công!


Phạm Tuân


Chúc các bạn thành công!
PHẠM TUÂN