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.
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