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 ReadOnlyObservableCollectionbộ sưu tập bên trong thì bắt buộc phải lấy từ ObservableCollectionhà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 ReadOnlyObservableCollectionthay đổ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ự CollectionChangedcủ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 ReadOnlyObservableCollectionvới tùy chỉnh này ObservableReadOnlyCollectionvà bạn đã hoàn tất.
Các ObservableReadOnlyCollectionda ReadOnlyObservableCollection.CollectionChangedvớ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.