Thứ hai, ngày 5 tháng 12 năm 2016

WPF – Data Validation

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

Để hiển thị lỗi khi người dùng nhập dữ liệu sai, WPF cung cấp lớp ValidationRule để hight light control chứa dữ liệu không hợp lệ. Tính năng này tương tự như ErrorProvider trong Windows Forms và các control Validator trong ASP.NET.

Để hiển thị lỗi khi người dùng nhập dữ liệu sai, WPF cung cấp lớp ValidationRule để hight light control chứa dữ liệu không hợp lệ. Tính năng này tương tự như ErrorProvider trong Windows Forms và các control Validator trong ASP.NET.

Exception Validation Rule

ExceptionValidationRule là một build-in ValidationRule của .NET dùng để kiểm tra exception được ném ra khi binding source bị thay đổi.

Để ví dụ, tôi tạo một lớp Student và trong setter của property Age, tôi ném ra một exception nếu như giá trị gán nằm ngoài khoảng 10 – 50.

public class Student
{
    private int _age;
    public int Age
    {
        get { return _age; }
        set
        {
            if (value 50)
            {
                throw new Exception("Student's age must not be greater than 50 or less than 10");
            }
            _age=value;
        }
    }
}

Trong MainWindow.xaml tôi tạo binding property TextBox.Text cho property Student.Age, vì Student.Age có setter nên binding mode này là TwoWay. Khi bạn thay đổi property TextBox.Text, giá trị này sẽ được gán cho Student.Age.

Chú ý trong collection Binding.ValidationRules, tôi thêm vào một ExceptionValidationRule:



















Nhấn Ctrl+F5 để bỏ qua debug, khi bạn nhập giá trị ngoài khoảng cho chép (10-50) vào TextBox, một viền đỏ bao quanh TextBox sẽ xuất hiện báo hiệu nhập sai:

Một cách viết khác để sử dụng ExceptionValidationRule là gán thuộc tính Binding.ValidatesOnExceptions = true:


Lấy thông điệp lỗi

Nếu dữ liệu nhập không hợp, các  lỗi sẽ được lưu trong collection Validation.Errors (một attached property). Đây là tập hợp chứa các đối tượng ValidationError, bạn có thể lấy được thông điệp lỗi qua property ErrorContent của đối tượng này. Ví dụ sau sẽ hiển thị thông điệp lỗi đầu tiên nếu có, nếu muốn hiển thị tất cả lỗi bạn có thể tạo một Custom Value Converter.

Kết quả:

Validation.Error Attached Event

Trong trường hợp nhập dữ liệu sai, bạn có thể thiết lập cho phép sự kiện lỗi có được phép kích hoạt hay không bằng cách dùng thuộc tính boolean Binding.NotifyOnValidationError. Nếu giá trị của thuộc tính là true, sự kiện Validation.Error sẽ được kích hoạt mỗi khi dữ liệu nhập vào control không hợp lệ.

Trong ví dụ dưới, tôi thêm phương thức xử lý sự kiện txtAge_Error cho Validation.Error, đồng thời gán NotifyOnValidationError=true trong phần binding của TextBox.


Trong code-behind, bạn có thể lấy được thông điệp lỗi để hiển thị lên màn hình thông qua một MessageBox hay control. Ở đây tôi gán thông điệp lỗi vào thuộc tính FrameworkElement.ToolTip:

private void txtAge_Error(object sender, ValidationErrorEventArgs e) { ((Control)sender).ToolTip = e.Error.ErrorContent.ToString(); }

Kết quả:

Validation.ErrorTemplate Attached Property

Mặc định Validation sử dụng template mặc định là viền đỏ bao quanh control. Bạn có thể thay đổi template này bằng cách tạo một control template và gán vào thuộc tính Validation.ErrorTemplate.

Lưu ý rằng đây là một control template áp dụng trên adorner layer, tức là lớp nằm bên trên control và dùng để thêm các chức năng, bố cục bên ngoài control.

Với loại control template này, bạn sử dụng lớp AdornedElementPlaceholder  để đại diện cho control được áp dụng template (trong ví dụ này là TextBox). Công việc của tôi bây giờ là thiết kế template trang trí thêm bên ngoài TextBox này bằng Border và một Image:
















Kết quả:

Validation và Style

Rất hợp lý nếu bạn sử dụng Style để thay đổi giao diện của control khi kiểm tra validation. Dựa vào thuộc tính  Validation.HasError, bạn có thể tạo một trigger bên trong Style để làm điều này.










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
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.