2012-04-20 71 views
6

Tôi nhầm lẫn về cách hoạt động của ObservableCollectionINotifyPropertyChanged.Sự khác nhau giữa ObservableCollection và INotifyPropertyChanged là gì?

tôi có mã này:

Payments = new ObservableCollection<PaymentViewModel>(_allPayments); 

public ObservableCollection<PaymentViewModel> Payments 
{ 
    get { return _payments; } 
    set { 
     _payments = value; 
     RaisePropertyChanged("Payments"); 
    } 
} 

Tôi không hiểu mối quan hệ giữa ObservableCollectionINotifyPropertyChanged đây là những gì. Bạn có thể giải thích?

Trả lời

6

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ọ, 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.

2

Một ObservableCollection thông báo cho chất kết dính của nó, ví dụ như khi một cái gì đó được thêm/xóa vào bộ sưu tập.

Tuy nhiên, điều bạn đang làm trong ví dụ thứ hai là thông báo rằng bộ sưu tập đã được thay thế bằng bộ sưu tập mới (cái mà ObservableCollection không tự làm, nếu bạn thực hiện ObservableCollection mới)).

+0

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

Các vấn đề liên quan