tenga en cuenta que estoy intentando utilizar la acción NotifyCollectionChangedAction.Add en lugar de .Reset. este último funciona, pero no es muy eficiente con grandes colecciones.ObservableCollection: llamando a OnCollectionChanged con múltiples elementos nuevos
así que una subclase ObservableCollection:
public class SuspendableObservableCollection<T> : ObservableCollection<T>
por alguna razón, este código:
private List<T> _cachedItems;
...
public void FlushCache() {
if (_cachedItems.Count > 0) {
foreach (var item in _cachedItems)
Items.Add(item);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add, (IList<T>)_cachedItems));
}
}
es tirar Una colección Añadir evento se refiere al elemento que no pertenece a la colección
esto parece ser un bu g en BCL?
puedo paso a través y ver antes de llamar OnCollectionChanged que se agregan nuevos elementos a this.Items
WOW
acaba de hacer un descubrimiento sorprendente. Ninguno de estos enfoques funcionó para mí (flush, addrange), porque el error parece activarse SOLAMENTE si esta colección está ligada a mi Listview.
TestObservableCollection<Trade> testCollection = new TestObservableCollection<Trade>();
List<Trade> testTrades = new List<Trade>();
for (int i = 0; i < 200000; i++)
testTrades.Add(t);
testCollection.AddRange(testTrades); // no problems here..
_trades.AddRange(testTrades); // this one is bound to ListView .. BOOOM!!!
En conclusión, ObservableCollection ¿Apoya la adición de listas incrementales, pero un ListView que no. Andyp descubrió una solución para hacer que funcione con CollectionView a continuación, pero desde que se llama a .Refresh(), eso no es diferente a llamar a OnCollectionChanged (.Reset) ..
¿Por qué RemoveRange, AddRange fire Reset? ¿Tal vez alguien no podría entender la diferencia entre quitar, agregar y restablecer significados? –