Giải pháp
ReadOnlyObservableCollection.CollectionChanged
không được hiển thị (vì những lý do hợp lệ được nêu trong các câu trả lời khác), vì vậy, hãy tạo lớp trình bao bọc của riêng chúng tôi để hiển thị nó:
public class ObservableReadOnlyCollection<T> : ReadOnlyObservableCollection<T>
{
public new NotifyCollectionChangedEventHandler CollectionChanged;
public ObservableReadOnlyCollection(ObservableCollection<T> list) : base(list) { }
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs args) =>
CollectionChanged?.Invoke(this, args);
}
Giải trình
Mọi người đã hỏi tại sao bạn muốn quan sát các thay đổi đối với bộ sưu tập chỉ đọc, vì vậy tôi sẽ giải thích một trong nhiều tình huống hợp lệ; khi bộ sưu tập chỉ đọc bao bọc một bộ sưu tập nội bộ riêng tư có thể thay đổi.
Đây là một tình huống như vậy:
Giả sử bạn có một dịch vụ cho phép thêm và xóa các mục vào bộ sưu tập nội bộ từ bên ngoài dịch vụ. Bây giờ, giả sử bạn muốn tiết lộ các giá trị của bộ sưu tập nhưng bạn không muốn người tiêu dùng trực tiếp thao túng bộ sưu tập; vì vậy bạn bọc bộ sưu tập nội bộ trong a ReadOnlyObservableCollection
.
Lưu ý rằng để bao bọc bộ sưu tập bên trong với ReadOnlyObservableCollection
bộ sưu tập bên trong thì bắt buộc phải lấy từ ObservableCollection
hàm tạo của ReadOnlyObservableCollection
.
Bây giờ, giả sử bạn muốn thông báo cho người tiêu dùng về dịch vụ khi bộ sưu tập nội bộ thay đổi (và do đó khi bộ sưu tập tiếp xúc ReadOnlyObservableCollection
thay đổi). Thay vì cán triển khai thực hiện riêng của bạn, bạn chỉ muốn để lộ sự CollectionChanged
của ReadOnlyObservableCollection
. Thay vì buộc người tiêu dùng phải đưa ra giả định về việc triển khai ReadOnlyObservableCollection
, bạn chỉ cần trao đổi ReadOnlyObservableCollection
với tùy chỉnh này ObservableReadOnlyCollection
và bạn đã hoàn tất.
Các ObservableReadOnlyCollection
da ReadOnlyObservableCollection.CollectionChanged
với nó là của riêng, và chỉ đơn giản là đi trên tất cả các bộ sưu tập thay đổi các sự kiện để bất cứ xử lý sự kiện kèm theo.