Thứ sáu, ngày 15 tháng 12 năm 2017

WPF – Tạo Custom Validation Rule

Ngày đăng: 26/3/2012, 8:39:23AM | Lượt xem: 8,435
Hot!

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,…

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ả:

http://yinyangit.wordpress.com

Bài liên quan:

 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
ca do bong da online
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.