2011-02-16 18 views
7

Estaba intentando implementar una colección especializada que funciona como ObservableCollection para encapsular algunos mecanismos más en ella, para hacer eso también dejo que mi colección herede de Collection y también implemente las mismas interfaces.¿Cómo funciona ObservableCollection <T> .Add?

Yo no lo entiendo, aunque cómo se pone efectivamente en marcha el conjunto de recogida-cambiado-lógica, por ejemplo Collection<T>.Add no está siendo anulado (ni siquiera se marca como virtual), así que ¿cómo funciona el ObservableCollection desencadenar el evento CollectionChanged si los artículos fueron agregados usando ese método?

Respuesta

10

Para responder a su pregunta específica, Collection<T>.Add llama al método virtual InsertItem (después de verificar que la colección no sea de solo lectura). ObservableCollection<T> de hecho anula este método para hacer la inserción y elevar las notificaciones de cambio relevantes.

+0

Ah, así que eso es cómo funciona eso, gracias una vez más! (¿Cómo lo sabes?) –

+1

@ H.B., ¿Has oído hablar de [Reflector] (http://www.red-gate.com/products/dotnet-development/reflector/)? –

+0

@Darin Tengo pero me dijeron que ahora cuesta dinero y me buscarán si dejo una copia en mi sistema http://tirania.org/blog/archive/2011/Feb-04.html –

0

Recuerde, la clave no está en anular los métodos de colección base, es en el hecho de que implementará la interfaz ICollection. Y francamente, en lugar de heredar de una clase Collection, sugeriría en su lugar crear una clase de adaptador que tome una ICollection en el constructor y sus métodos simplemente delegarán en la colección interna y generarán los eventos apropiados.

8

lo hace llamando InsertItem que se anula y se puede ver en la descompilación

protected override void InsertItem(int index, T item) 
{ 
    this.CheckReentrancy(); 
    base.InsertItem(index, item); 
    this.OnPropertyChanged("Count"); 
    this.OnPropertyChanged("Item[]"); 
    this.OnCollectionChanged(NotifyCollectionChangedAction.Add, item, index); 
} 
+0

Gracias, también, Ani fue más rápido, así que le di esto. –

Cuestiones relacionadas