2011-07-29 22 views
16

Tengo ObservableCollection, puedo agregar y eliminar elementos de la colección. Pero no puedo reemplazar un elemento existente en la colección. Hay una manera de reemplazar un artículo y reflejarlo en mis componentes vinculados.Observable Colección reemplazar elemento

System.Collections.Specialized.NotifyCollectionChangedAction.Replace 

¿Alguien puede mostrarme cómo lograr esto?

+0

posible duplicado de [¿Cómo actualizo un solo elemento en una clase ObservableCollection?] (Http://stackoverflow.com/questions/6781192/how-do-i-update-a-single-item-in-an -observablecollection de clase) – KyleMit

Respuesta

47
collection[someIndex] = newItem; 
+0

hice achive esto mediante la implementación de esta clase MyObservableCollection clase pública : ObservableCollection { MyObservableCollection pública() { } MyObservableCollection pública (Lista de recolección) { MyObservableCollection mb = nuevo MyObser vableCollection (); para (int x = 0; x thewayman

+4

No es necesario que haga su propia clase. Simplemente puede escribir 'collection [someIndex] = newItem'. – SLaks

2

Actualizado: paso a paso utiliza SetItem anulado y notifica acerca de los cambios.

Creo que la respuesta sobre el uso de indexador puede ser mal, debido a que la pregunta era sobre reemplazar y notificar.

Solo para aclarar: ObservableCollection<T> utiliza indexador de su clase base Collection<T>, que a su vez es una envoltura de List<T>, que es una envoltura de matriz simple de T. Y no hay anulación para el método del indexador en la implementación ObservableCollection.

Así que cuando se utiliza indexador para reemplazar un elemento en ObservableCollection invoca el siguiente código de Colección clase:

public T this[int index] { 
     get { return items[index]; } 
     set { 
      if(items.IsReadOnly) { 
       ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection); 
      } 

      if (index < 0 || index >= items.Count) { 
       ThrowHelper.ThrowArgumentOutOfRangeException(); 
      } 

      SetItem(index, value); 
     } 

Simplemente comprueba límites y llama SetItem que utiliza indexador de subyacente Lista clase:

protected virtual void SetItem(int index, T item) { 
     items[index] = item; 
    } 

Durante la asignación no hay llamadas al CollectionChanged evento, porque las colecciones subyacentes no saben nada de eso.

Pero cuando se utiliza SetItem método, se llama de la clase ObservableCollection:

protected override void SetItem(int index, T item) 
    { 
     CheckReentrancy(); 
     T originalItem = this[index]; 
     base.SetItem(index, item); 

     OnPropertyChanged(IndexerName); 
     OnCollectionChanged(NotifyCollectionChangedAction.Replace, originalItem, item, index); 
    } 

Después de la asignación que llama OnCollectionChanged método, que dispara CollectionChanged evento con parámetro de acción NotifyCollectionChangedAction.Replace.

protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
    { 
     if (CollectionChanged != null) 
     { 
      using (BlockReentrancy()) 
      { 
       CollectionChanged(this, e); 
      } 
     } 
    } 

Como conclusión: la idea con clase personalizada heredada de ObservableCollection y Replace método que llama base.SetItem() vale la pena intentarlo.

+1

Operador [] utiliza el método reemplazado SetItem de ObservableCollection –

+0

Gracias por aclarar. –

Cuestiones relacionadas