WPF – Tạo Custom Validation Rule

Thay vì sử dụng ExceptionValidationRule để bắt các ngoại lệ, bạn có thể tự tạo ra các ValidationRule cho từng mục đích riêng như kiểm tra giá trị nhập trong khoảng cho phép, kiểm tra chuỗi dựa vào regular expression,…

Để tạo một Custom Validation Rule, bạn chỉ cần tạo một lớp thừa kế từ lớp abstract ValidationRule. Lớp này chỉ có duy nhất một phương thức được định nghĩ chính là constructor. Phương thức này có dạng:

public abstract ValidationResult Validate(
	Object value,
	CultureInfo cultureInfo
)

Khi override phương thức này, ta sẽ kiểm tra hợp lệ với giá trị của tham số value (từ binding target).

Trong trường hợp thành công, ta sẽ trả về một đối tượng ValidationRule mới có dạng ValidationRule(true, null).

Ngược lại một giá trị ValidationRule(false,<error message>) sẽ được trả về báo hiệu rằng giá trị của value không hợp lệ.

Để minh họa tôi sử dụng lớp sau làm binding source:

public class Student
{
    public int Age
    {
        get;
        set;
    }
}

Sau đó tạo một ValidationRule dùng để kiểm tra hợp lệ của một số kiểu int trong khoảng cho phép. Khoảng giới hạn này được xác định bởi hai property là Minimum và Maximum. Đồng thời việc tạo thêm một property ErrorMessage sẽ rất cần thiết để cho phép người dùng tự xác định thông điệp lỗi:

public class NumberRangeValidationRule : ValidationRule
{

    public int Minimum { get; set; }

    public int Maximum { get; set; }

    public string ErrorMessage { get; set; }

    public override ValidationResult Validate(object value,
        CultureInfo cultureInfo)
    {
        ValidationResult result = new ValidationResult(true, null);
        int num;
        if (!int.TryParse(value.ToString(), out num))
            result = new ValidationResult(false, "The input value must be a number");
        else if (num < Minimum || num > Maximum)
        {
            result = new ValidationResult(false, this.ErrorMessage);
        }
        return result;
    }
}

Cuối cùng là tạo giao diện để kiểm tra công việc đã làm trong tài liệu xaml:

<Window x:Class="DataValidationDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DataValidationDemo"
        Title="DataValidationDemo" Height="200" Width="350">
    <Window.Resources>
        <local:Student x:Key="student1" Age="10"/>
        <ControlTemplate x:Key="textBoxErrorTemplate">
            <StackPanel>
                <Border BorderBrush="Red" BorderThickness="1">
                    <AdornedElementPlaceholder Name="a" />
                </Border>
                <TextBlock DockPanel.Dock="Bottom" Foreground="Red"
                           Text="{Binding ElementName=a, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/>
            </StackPanel>
        </ControlTemplate>
    </Window.Resources>
    <StackPanel DataContext="{StaticResource student1}">
        <TextBlock Text="Enter an age in the range 10 - 50:"/>
        <TextBox x:Name="txtAge" Margin="6"
                Validation.ErrorTemplate="{StaticResource textBoxErrorTemplate}">
            <TextBox.Text>
                <Binding Path="Age" UpdateSourceTrigger="PropertyChanged" >
                    <Binding.ValidationRules>
                        <local:NumberRangeValidationRule Minimum="10" Maximum="50"
                                                 ErrorMessage="The input value must be a number between 10 and 50" />
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>
    </StackPanel>

</Window>

Kết quả:

https://yinyangit.wordpress.com

Bài liên quan:

Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s