una que metodos manejo librería eventos evento ejemplos delegados crear control biblioteca c# wpf observablecollection inotifycollectionchanged

metodos - que es un control en c#



¿Cómo puedo generar un evento CollectionChanged en una colección Observable y pasarle los elementos modificados? (2)

Tengo una clase que hereda de ObservableCollection y agrega algunos métodos adicionales, como AddRange y RemoveRange

Mi método base es el siguiente:

public void AddRange(IEnumerable<T> collection) { foreach (var i in collection) Items.Add(i); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); }

Mi problema con esto es que quiero acceder a e.NewItems o e.OldItems en el evento CollectionChanged para realizar una acción en cualquier elemento de la colección, y la acción NotifyCollectionChangedAction.Reset no pasa estos valores

void Instances_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) // e.NewItems is always null { foreach (var item in e.NewItems) { if (item is EventInstanceModel) ((EventInstanceModel)item).ParentEvent = this; } } }

Así que pensé que solo podía usar NotifyCollectionChangedAction.Add lugar de Reset , sin embargo, las Range actions are not supported

public void AddRange(IEnumerable<T> collection) { var addedItems = collection.ToList(); foreach (var i in addedItems) Items.Add(i); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, addedItems)); }

Entonces, mi pregunta es, ¿cómo puedo generar un evento CollectionChanged y pasar la lista de elementos nuevos o antiguos?


Esto funciona bien para mí "independiente". Es decir, no estoy usando un ObservableCollection para el enlace de datos. Entonces, no es un problema de ObservableCollection sino más bien una limitación de ListCollectionView .

Por favor, lea el siguiente artículo, es una lectura muy interesante:

Blog de Nathan Nesbit


Lo he estado buscando y aparentemente el método CollectionChanged no se puede aumentar con varios elementos.

Asi puedo llamar

OnCollectionChanged(new NotifyCollectionChangedEventArgs( NotifyCollectionChangedAction.Add, singleItem));

pero no puedo llamar

OnCollectionChanged(new NotifyCollectionChangedEventArgs( NotifyCollectionChangedAction.Add, listOfItems));

Por ahora, lo que he hecho es simplemente elevar el evento Agregar para cada elemento agregado, pero todavía estoy bastante descontento con esto, ya que significa que levanto el evento CollectionChanged para cada elemento en el método AddRange lugar de solo una vez.

public void AddRange(IEnumerable<T> collection) { foreach (var i in collection) { Items.Add(i); OnCollectionChanged(new NotifyCollectionChangedEventArgs( NotifyCollectionChangedAction.Add, i)); } }