Warum ObservableCollection nicht unterstützt bulk-änderungen?
Was sind die möglichen Probleme, verursacht durch einen ObservableCollection
unterstützt Operationen wie AddRange
oder RemoveRange
? Es muss einen Grund warum Microsoft nicht bieten, Ihnen, jetzt, dass die ObservableCollection ist so Häufig verwendet mit WPF.
Könnten Sie implementieren Ihre eigene Kollektion, unterstützt bulk-Operationen und implementiert INotifyCollectionChanged
. Was passiert, wenn ich binden wie ein Steuerelement an ein ItemsControl ist?
Kennt jemand ItemsControls, die keine Unterstützung für bulk-änderungen?
Es ist ein BulkObservableCollection-Klasse in Microsoft.VisualStudio.Sprache.Intellisense.BulkObservableCollection<T> msdn.microsoft.com/en-us/library/dd867973.aspx
InformationsquelleAutor DanT | 2012-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke es ist nicht so, dass es irgendwelche möglichen Nachteile oder Probleme, es ist nur, dass es nicht da ist. In der Tat werden Sie feststellen, dass die meisten Arten in 'System.Sammlungen.Generic' don T liefern 'AddRange" - Funktionalität.
Mittlerweile, viele Menschen haben Ihre eigenen Versionen von "ObservableCollection' die Funktionalität, die Sie möchten. INotifyCollectionChanged enthält genug Informationen für seine Handler zu notieren, wenn eine Reihe von Gegenständen beeinflusst wurden wohl aus diesem Grund.
Last but not least, wenn Sie binden eine Kollektion, das diese 'Palette' Art Operationen werden Sie feststellen, dass Sie mit Ihrer Benutzeroberfläche, wie Sie es erwarten
InformationsquelleAutor A.R.
Gibt es zahlreiche Erweiterungen
ObservableCollection
können auf dem internet gefunden werden hinzufügen, dass das Konzept des hinzufügen /entfernen-Bereich, oder lassen Sie zu verschieben, updates und Feuer Sie Sie manuell. Siehe zum Beispiel dieser Stack Overflow Frage:ObservableCollection unterstützt keine AddRange-Methode, damit ich benachrichtigt, für jedes Element Hinzugefügt, außer dem, was über INotifyCollectionChanging?
Können Sie auch Umsetzung einer bulk hinzufügen, feuert ein reset-Ereignis, die bewirken, dass das UI neu-Rendern aller Elemente in der Auflistung:
http://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/
Diese ermöglichen es Ihnen, effizienter zu verwalten den UI-updates. Wie ein
ItemsControl
Griffe eine Sammlung geändert, Ereignis-details eine Liste der geänderten Elemente ist bis auf das WPF-framework selbst. Ich gehe davon aus, dass es diese verarbeitet intelligent!Mein Rat an Sie ist, wenn die Leistung entscheidend ist, und Sie haben Sammlungen mit zahlreichen Elementen aktualisiert und erleben performance-problem, dann Unterklasse
ObservableCollection
zu verwalten Sammlung der Nachricht geändert wird, in einer Weise, die am besten für Ihre Anwendung gerecht zu werden.CollectionChanged
Ereignis ausgelöst wird für jedes Element Hinzugefügt, dann wieder zurücksetzen, um die Sammlung!Hallo Kent, meinst du das SO beantworten? sieht gut aus für mich. Die AddRange-Methode iteriert über die Elemente Hinzugefügt, dann feuert Sie einen einzelnen CollectionChanged-Ereignis, mit einer ändern Art von 'add' liefert die Liste der hinzugefügten Elemente. Die Formatierung des Codes ist nicht so gut, aber 😉
da die RangeObservableCollection erstreckt ObservableCollection-Aufruf Hinzufügen, auf jeder Position die Ergebnisse in der CollectionChangedEvent ausgelöst wird, für jedes Element Hinzugefügt. Dann alle Mühe, dass geht zu verschwenden, durch das zurücksetzen der Kollektion nachdem alle Elemente Hinzugefügt werden.
Außer, dass es nicht funktioniert, da der code verknüpft überschreibt auch OnCollectionChanged zu unterdrücken CollectionChangedEvent wenn ein flag gesetzt ist; die AddRange-Methode setzt das flag, durchläuft, und fordert Sie für jedes Element, und dann entfernt die Flagge.
InformationsquelleAutor ColinE
NotifyCollectionChangedEventArgs
enthält index-Informationen. Entfernen von Elementen bewirkt, dass die Indizes Regierungsumbildung, wie das einfügen von Elementen. Daher, zwar nicht ganz unmöglich, wäre es wohl eher schwierig und wahrscheinlich auch ineffizient, bieten die Möglichkeit, die Arbeit mit Bereichen.NÖ, was ist, wenn ich entfernen die ersten und letzten Elemente der Sammlung? Es gibt nur einen index in der event-args, aber zwei Indizes notwendig sind.
Es gibt zwei Indizes. Es ist 'NewStartingIndex' und 'OldStartingIndex'. Dessen Beschreibung liest "Wird der index, an dem ein Verschieben, Entfernen oder Ersetzen-Aktion aufgetreten.", Auch, es sei denn, Sie entfernen ALLE Elemente in der Auflistung, das Szenario, das Sie beschreiben, ist nicht möglich, da die Elemente in einer Reihe aneinander Grenzen.
Mein schlechtes - ich verlesen der OP. Ich dachte, die Frage war etwa, warum es keine
RemoveAll
, wie es ist mitList<T>
. Du hast Recht:AddRange
/RemoveRange
wäre sehr leicht zu bewerkstelligen.InformationsquelleAutor Kent Boogaart
Bieten Sie nicht jedes mögliche Stück Funktionalität, es ist (auch) eine Kosten-und Nachfrage Ding.
Ja. Und wenn Sie das tun, werden Sie feststellen, dass die Sammlung haben, um Entscheidungen darüber, wie/Wann propagieren diese änderungen. Ich habe nie versucht, aber ich kann mir vorstellen es gibt einige trade-offs, die View oder ViewModel kann bessere Entscheidungen treffen, als eine wiederverwendbare Sammlung.
InformationsquelleAutor Henk Holterman