Estoy usando un ListBox para mantener una lista de elementos en una aplicación de WPF. La fuente de datos ListBox es un HashSet envuelto en un ObservableCollection. es decir, que tiene el siguiente código:Uso de HashSets con ObservableCollection con WPF
this.shackSet = new ObservableCollection<Shack>(new HashSet<Shack>());
this.shackListing.ItemsSource = this.shackSet;
... donde shackListing es un control ListBox, y shackSet en un ICollection. Sin embargo, cada vez que agrego algo a shackSet después de agregar el primer elemento, veo varios elementos en el ListBox. es decir, es como que los elementos recién agregados se agregan a la lista, independientemente de si se agregaron al conjunto. Cuando miro a las firmas de ICollection # Añadir:
void Add(T obj);
... y HashSet # Añadir:
bool Add(T obj);
... esto me lleva a creer que hay un error que afecta HashSets envueltos en donde recientemente los elementos agregados se agregan al ListBox independientemente porque el ObservableCollection no tiene forma de saber si el objeto realmente se agregó a la colección subyacente porque el tipo de devolución de ICollection # Add es nulo. Puede alguien mas confirmar esto ?
Claro que se puede unir directamente a la hashset, pero si se agrega un elemento de WPF no se dará cuenta. –
+1 para la explicación. Sin embargo, con respecto a la solución propuesta, preferiría heredar de HashSet e implementar INotifyCollectionChanged ... –
+1 a lo que dijo Thomas, excepto que no puede heredar de 'HashSet' y también implementar' INotifyCollectionChanged', ya que los métodos 'HashSet' no son virtuales y no pueden anularse. Tendrá que implementar 'ICollection', y su implementación tendría que _wrap_' HashSet' y aumentar las notificaciones de todos los métodos de mutación. –