INotifyPropertyChanged

INotifyPropertyChanged cung cấp giao diện mẫu, trong đó cần triển khai một sự kiện có tên PropertyChanged, mục đích là để kích hoạt sự kiện thông báo nó có thay đổi một thuộc tính nào đó.
Để triển khai INotifyPropertyChanged, thì cần triển khai sự kiện PropertyChanged, theo mẫu sau. Ví dụ xây dựng lớp Student
public class Student : INotifyPropertyChanged
{
    //...

    public event PropertyChangedEventHandler PropertyChanged;
}
Trong Student, khi muốn thông báo một thuộc tính nào đó, ví dụ thuộc tính đó có tên là PropertyName rằng nó mới thay đổi thì thi hành PropertyChanged theo mẫu sau:
//..//
PropertyChanged.Invoke(this, new PropertyChangedEventArgs("PropertyName"));
//...
Ví dụ: cập nhật lại Student, cho vào thêm hai thuộc tính là NameBirthYear và khi giá trị 2 thuộc tính này thay đổi thì nó sẽ gửi event mà nối tượng bắt event sẽ nhận được.
 public class Student : INotifyPropertyChanged
{
    private string _name;
    public string Name {
        get => _name;
        set
        {
            _name = value;
            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
            }
        }
    }

    private int _birthyear;
    public int BirthYear
    {
        get => _birthyear;
        set
        {
            _birthyear = value;
            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs("BirthYear"));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

}
Bằng cách xây dựng lớp Student như trên, thì mỗi khi thuộc tính của nó thay đổi, nó sẽ gửi thông tin đến cho đối tượng sử dụng biết. Điểu này đặc biệt có ích trong kỹ thuật Binding dữ liệu, ví dụ có một danh sách sinh viên hiện thị trong ListView, thì khi một thay đổi thuộc tính của sinh viên nào đó, thì ListView sẽ nhận được và sẽ cập nhật mới theo sự thay đổi đó.

Sử dụng thử lớp Student

static void Main(string[] args)
{

    Student student = new Student();
    //Bắt sự kiện khi student thay đổi giá trị thuộc tính
    student.PropertyChanged += Student_PropertyChanged;


    student.Name = "TEN 1";
    student.Name = "TEN 2";
    student.BirthYear = 2001;
    student.Name = "TEN 3";
    student.BirthYear = 2002;
}

//Xử lý khi student thông báo có thay đổi thuộc tính
private static void Student_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    string propertyName = e.PropertyName;
    object value = sender.GetType().GetProperty(propertyName).GetValue(sender, null);
    Console.WriteLine($"{propertyName} => {value}");
}
Chạy thử, kết quả
Name => TEN 1
Name => TEN 2
BirthYear => 2001
Name => TEN 3
BirthYear => 2002

Xem thêm về cách đọc thuộc tính của đối tượng với Type để biết cách đọc dữ liệu thuộc tính của đổi tượng nhận được.


Đăng ký nhận bài viết mới