MVVM trong WFP (Part 4/4): Data Validation

WPF - Data Validation - IDataErrorInfoKiểm tra tính hợp lệ của dữ liệu là một phần quan trọng trong mọi ứng dụng. Trong mô hình MVVM, ta có thể thực hiện việc kiểm tra này bằng cách sử dụng hai interface IDataErrorInfo . Ta sẽ hiện thực các interface này cho các class của phần Model.

Interface IDataErrorInfo

Interface IDataErrorInfo bao gồm hai thành viên:

–          Property Error: trả về chuỗi thông điệp lỗi cho đối tượng dữ liệu. Thông thường property này ít được sử dụng và WPF không tự động thực thi nó.

–          Một indexer có kiểu trả về là string và có tham số là tên property của đối tượng dữ liệu (tương ứng với tên cột của một entity object). Indexer này trả về thông điệp lỗi nếu property trong tham số chứa dữ liệu không hợp lệ, ngược lại nó cần trả về null hoặc chuỗi rỗng.

public class Student : IDataErrorInfo
{
    public string FullName { get; set; }
    public DateTime Birthday { get; set; }

    #region IDataErrorInfo Members

    public string Error
    {
        get { return null; }
    }

    public string this[string propertyName]
    {
        get
        {
            string error = null;
            switch (propertyName)
            {
                case "FullName":
                    if (string.IsNullOrEmpty(FullName))
                        error = "Please enter a Name";
                    break;
                case "Birthday":
                    int age = DateTime.Now.Year - Birthday.Year;
                    if (age < 10 || age > 50)
                        error = "Please enter a valid age";
                    break;
                default:
                    throw new Exception("Unexpected property: "+propertyName);
            }
            return error;
        }
    }

    #endregion
}

Để kiểm tra ta tạo một TextBox với DataContext được gắn vào một đối tượng Student bất kì.

<TextBox Name="txtName"
Height="30"
Text="{Binding UpdateSourceTrigger=PropertyChanged, Path=FullName,
ValidatesOnDataErrors=True, NotifyOnValidationError=True}"           Validation.Error="txtName_Error" />

ValidatesOnDataErrors: xác định có sử dụng DataErrorValidationRule để kiểm tra hay không. Chỉ khi bạn đặt property này là true thì control mới được kiểm tra dữ liệu hợp lệ. Bạn có thể tạo một custom ValidationRule bằng cách tham khảo bài: WPF – Data Validation.

NotifyOnValidationError: xác định có kích hoạt attached event Validation.Error hay không.

Bạn có thể viết trong sự kiện Validation.Error các mã lệnh để hiển thị lỗi và thay đổi giao diện chương trình. Tuy nhiên ta có thể sử dụng binding để hiển thị thông điệp lỗi lên cửa sổ. Các lỗi xảy ra khi kiểm tra hợp lệ đều được thêm vào attacted property Validation.Errors. Đây là một collection của các đối tượng ValidationError.

Như ví dụ sau tôi tạo thêm một TextBlock bên dưới để hiển thị thông điệp lỗi nếu như người dùng nhập dữ liệu không hợp lệ vào TextBox txtName:

<TextBox Name="txtName" Height="30"
	    Text="{Binding UpdateSourceTrigger=PropertyChanged, Path=FullName,
	        ValidatesOnDataErrors=True}" />

<TextBlock Foreground="Red" Text="{Binding ElementName=txtName,Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

WPF - Data Validation - IDataErrorInfo

Ví dụ MVVM hoàn chỉnh

Ví dụ này tôi lấy từ tác giả Josh Smith trong bài viết WPF Apps With The Model-View-ViewModel Design Pattern, bao gồm các nội dung:

  • Patterns and WPF
  • MVP pattern
  • Why MVVM is better for WPF
  • Building an application with MVVM

Code download available from the MSDN Code Gallery

https://yinyangit.wordpress.com

Bài liên quan

Advertisements

3 thoughts on “MVVM trong WFP (Part 4/4): Data Validation

  1. Pingback: MVVM 1 INotifyPropertyChanged và INotifyCollectionChanged – Blog Dương Xuân Trà

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