ObservableCollection: appel de OnCollectionChanged avec plusieurs nouveaux éléments

veuillez noter que je suis en train d'utiliser NotifyCollectionChangedAction.Ajouter une action à la place de .Réinitialiser. ce dernier fonctionne, mais il n'est pas très efficace avec de grandes collections.

donc je sous-classé ObservableCollection:

public class SuspendableObservableCollection<T> : ObservableCollection<T>

pour une raison quelconque, ce code:

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

est à jeter
Une collection Ajouter un événement fait référence à un élément qui n'appartient pas à la collection

ce qui semble être un bogue dans la BCL ?

Je peux passer et voir avant de faire appel à OnCollectionChanged que de nouveaux éléments sont ajoutés à cela.Les éléments

WOW

juste fait une stupéfiante découverte. Aucune de ces approches n'a fonctionné pour moi (chasse d'eau, addrange), parce que l'erreur semble être déclenché UNIQUEMENT si cette collection est lié à mon 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 conclusion, ObservableCollection prend en charge l'ajout incrémental de listes, mais une ListView qui ne fonctionne pas. Andyp trouvé une solution de contournement pour le faire fonctionner avec CollectionView ci-dessous, mais depuis .Refresh() est appelée, ce qui n'est pas différent que de simplement appeler OnCollectionChanged( .Remise à zéro )..

source d'informationauteur Sonic Soul