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à Name
và BirthYear
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.