Я использую ListBox для ведения списка элементов в приложении WPF. Источником данных ListBox является HashSet, завернутый в ObservableCollection. то есть, у меня есть следующий код:Использование HashSets с ObservableCollection с WPF
this.shackSet = new ObservableCollection<Shack>(new HashSet<Shack>());
this.shackListing.ItemsSource = this.shackSet;
... где shackListing является контроль ListBox, и shackSet в ICollection. Однако всякий раз, когда я добавляю что-нибудь в shackSet после добавления первого элемента, я вижу несколько элементов в ListBox. т.е. как новые добавленные элементы добавляются в список независимо от того, добавлены ли они в набор. Когда я смотрю на подписи ICollection # Добавить:
void Add(T obj);
... и HashSet # Добавить:
bool Add(T obj);
... это заставляет меня верить, что есть ошибка, которая влияет на обернутые HashSets где вновь добавленные элементы добавляются в ListBox независимо от того, что ObservableCollection не может сказать, действительно ли объект был добавлен в подклассу, потому что возвращаемый тип ICollection # Add недействителен. Может ли кто-нибудь подтвердить это?
Конечно, вы можете связать непосредственно с HashSet, но если добавить элемент WPF не заметит. –
+1 для объяснения. Однако, в отношении предлагаемого решения, я бы скорее наследовал от HashSet и реализовал INotifyCollectionChanged ... –
+1 к тому, что сказал Томас, за исключением того, что вы не можете наследовать от «HashSet», а также реализовать «INotifyCollectionChanged», поскольку методы «HashSet» не являются виртуальными и не могут быть переопределены. Вам придется реализовать 'ICollection', и ваша реализация должна будет _wrap_' HashSet' и повышать уведомления обо всех методах мутирования. –