Tôi đang sử dụng ListBox để duy trì danh sách các mục trong ứng dụng WPF. Nguồn dữ liệu ListBox là một HashSet được bao bọc trong một ObservableCollection. tức là, tôi có mã sau:Sử dụng HashSets với ObservableCollection với WPF
this.shackSet = new ObservableCollection<Shack>(new HashSet<Shack>());
this.shackListing.ItemsSource = this.shackSet;
... trong đó shackListing là một điều khiển ListBox và shackĐặt trong một ICollection. Tuy nhiên, bất cứ khi nào tôi thêm bất cứ thứ gì vào shackSet sau khi thêm mục đầu tiên, tôi thấy nhiều mục trong ListBox. tức là Nó giống như các mục mới được thêm vào đang được thêm vào danh sách bất kể chúng được thêm vào bộ này hay chưa. Khi tôi nhìn vào chữ ký của ICollection # Địa chỉ:
void Add(T obj);
... và HashSet # Add:
bool Add(T obj);
... điều này dẫn tôi để tin rằng có một lỗi có ảnh hưởng đến HashSets bọc nơi mới các mục được thêm vào được thêm vào ListBox bất kể vì ObservableCollection không có cách nào để nói liệu đối tượng có thực sự được thêm vào bộ sưu tập underlaying hay không bởi vì kiểu trả về của ICollection # Add bị vô hiệu. Ai có thể xác nhận điều này?
Chắc chắn bạn có thể liên kết trực tiếp đến HashSet, nhưng nếu một mục được thêm WPF sẽ không để ý. –
+1 để giải thích. Tuy nhiên, về giải pháp được đề xuất, tôi thà kế thừa từ HashSet và triển khai INotifyCollectionChanged ... –
+1 với những gì Thomas nói, ngoại trừ việc bạn không thể kế thừa từ 'HashSet' và cũng thực hiện' INotifyCollectionChanged', vì các phương thức 'HashSet' không phải là ảo và không thể bị ghi đè. Bạn sẽ phải thực hiện 'ICollection' và việc triển khai của bạn sẽ phải _wrap_' HashSet' và nâng cao thông báo trên tất cả các phương thức đột biến. –