Die Erhöhung WPF ObservableCollection-Leistung
Derzeit habe ich zwei WPF Listboxen imitieren die folgenden Funktionen
(Quelle: psu.edu)
Ich bin mit 2 ObservableCollections, damit Benutzer wählen, welche Elemente, die Sie benötigen (Flexibilität ist hier der Schlüssel). Das Hauptproblem ist, dass ich Tausende von Elementen, die zusammengefasst sind in beiden Listboxen. Alles in allem das design funktioniert wirklich gut (mit ein paar Dutzend Elemente), aber mein Stolperstein ist, wenn ein Benutzer Kopien alle verfügbaren Elemente von Links nach rechts, wie der Bildschirm friert ein (Zeit für die Ausführung in einem anderen thread?).
Blick auf ObservableCollection fehlt es ein AddRange-Methode, und es gibt verschiedene Implementierungen zur Verfügung auf dem internet. Ich weiß auch das CollectionChanged-Ereignis ist unnötig gefeuert zu werden, als jedes Element wird kopiert entleeren Leistung schrecklich.
Es kann gut sein, dass ich um Benutzern zu erlauben, wählen Sie aus Gruppen von mehr als 10 000 Artikel in die Zukunft, die klingt wie eine schlechte Idee, aber ist nicht verhandelbar, wie die Gruppierung auf die listbox (CollectionViewSource) funktioniert wirklich gut, hat aber den Nebeneffekt der Umstellung aus die die Virtualisierung konnte sowohl die Listboxen
Was kann ich tun zur Verbesserung der Leistung beim laden einer listbox mit tausenden von Elementen, wenn die Datenbindung an eine ObservableCollection? Gibt es irgendwelche AddRange geben Sie Implementierungen, die würden Sie empfehlen? Ist die einzige Wahl, die ich hier habe, diese laufen auf einem hintergrund-thread, das scheint teuer, denn ich bin nicht das laden von Daten aus einer Datenbank?
- Finden Sie diese stackoverflow.com/questions/1007691/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich entfernt, die CollectionViewSource und die Gruppierung und die Elemente werden kopiert über in 1/2 Sekunde, aber mit dem Gruppierung es kann bis zu einer minute dauern, da die Virtualisierung nicht funktioniert mit der Gruppierung.
Werde ich brauchen, um zu entscheiden, ob Sie die CollectionViewSource
Ich konnte nicht widerstehen, dies zu beantworten. Ich glaube nicht, dass Sie nicht brauchen mehr beantworten, aber vielleicht jemand anderes es verwenden kann.
Glaube nicht, dass zu hart (nicht-Ansatz dieser Multithread - (das macht die Sache fehleranfällig und unnötig kompliziert. Verwenden Sie nur Gewinde für harte Berechnungen/IO), alle diese verschiedenen actiontypes machen es einem sehr schwer zu Puffern. Der nervigste Teil ist, dass, wenn Sie entfernen oder hinzufügen von 10000 Elemente, die Ihre Anwendung (Listboxen) wird sehr beschäftigt mit der Behandlung von Ereignissen ausgelöst, die von der ObservableCollection. Die Veranstaltung unterstützt bereits mehrere Elemente. So.....
Könnte man die Puffer-Elemente, bis es verändert die Aktion. So Fügen Sie die Aktionen werden zwischengespeichert und in wil aufgewachsen, als batch, wenn der 'user' - Aktion verpasst oder flushes.
Haben noch nicht testen, aber Sie könnte so etwas tun:
Spaß haben!, J3R03N
Könnte Sie wahrscheinlich Erben von
ObservableCollection<T>
(oder direkt umsetzenINotifyCollectionChanged
) hinzufügenBeginUpdate
undEndUpdate
Methoden. Änderungen zwischen den anrufen zuBeginUpdate
undEndUpdate
wäre in der Warteschlange, dann kombiniert in eine (oder mehrere, wenn es getrennte Bereiche)NotifyCollectionChangedEventArgs
- Objekt übergeben werden würde, um die Handler desCollectionChanged
Ereignis, wennEndUpdate
genannt wird.Finden Sie eine Thread-sichere observable collection hier. Machen Sie Ihre Observable collection threadsicher und binden Sie Sie an listbox.