ObservableCollection
là một bộ sưu tập chuyên ngành mà có thể thông báo cho thuê bao khi nội dung của nó thay đổi, trong khi INotifyPropertyChanged
là một giao diện cho phép người thực hiện để thông báo cho thuê bao khi một trong tài sản của họ giá trị thay đổi.
Có thể bạn đang tự hỏi làm thế nào cả hai có liên quan (vì cả hai đều "có liên quan" trong setter trong ví dụ của bạn).
xem xét mã này:
var model = new MyViewModel(); // assume it's the class with Payments inside
model.Payments.Add(new PaymentViewModel());
Subscribers sự kiện INotifyCollectionChanged.CollectionChanged
bây giờ sẽ biết rằng mọi thứ đã thay đổi và họ nên cập nhật cho phù hợp.
Nhưng bây giờ xem xét điều này:
var model = new MyViewModel(); // assume it's the class with Payments inside
model.Payments.Add(new PaymentViewModel()); // OK, we know what this does
model.Payments = new ObservableCollection<PaymentViewModel>();
Sau khi thêm một mục vào bộ sưu tập chúng tôi sau đó hoán đổi toàn bộ bộ sưu tập cho nhau. Nếu một ItemsControl
bị ràng buộc với bộ sưu tập này, chúng tôi hy vọng nó sẽ tự cập nhật và phản ánh thực tế là model.Payments
sẽ bị trống. Nhưng làm thế nào nó có thể làm điều đó?
CollectionChanged
sẽ không giúp đỡ vì bộ sưu tập gốc (sau khi nhận được mục đầu tiên) không được sửa đổi; chúng tôi chỉ loại bỏ nó và cài đặt một vị trí khác. Người duy nhất biết rằng việc chuyển đổi xảy ra là thiết lập thuộc tính Payments
. Vì vậy, setter sử dụng INotifyPropertyChanged
để thông báo cho người đăng ký rằng bộ sưu tập đã được thay thế bằng bộ sưu tập khác và tất nhiên họ nên cập nhật trạng thái của họ.
Kết luận: công trình dữ liệu ràng buộc Automagically trong WPF bởi vì tất cả các điều khiển databound nghe INotifyPropertyChanged
của DataContext
của họ, và nếu mục tiêu ràng buộc thực hiện INotifyCollectionChanged
họ đăng ký vào đó là tốt. Nếu mục tiêu ràng buộc thay đổi, chúng sẽ được thông báo qua số INotifyPropertyChanged
, hủy đăng ký INotifyCollectionChanged
trên mục tiêu cũ và đăng ký với mục tiêu mới.
tôi cũng hiểu câu trả lời của bạn. Bạn cũng đưa ra câu trả lời đúng. Cảm ơn bạn. – pratikjgandhi