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:
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));
}
}