2012-03-05 18 views
11

Quali sono i potenziali problemi causati da operazioni di supporto ObservableCollection come AddRange o RemoveRange? Deve esserci un motivo per cui Microsoft non li ha forniti, ora che ObservableCollection viene utilizzato così frequentemente con WPF.Perché ObservableCollection non supporta le modifiche collettive?

È possibile implementare la propria raccolta che supporta operazioni e implementazioni bulk INotifyCollectionChanged. Cosa succede se lego un controllo di questo tipo ad un oggetto ItemsControl?

Qualcuno sa di ItemsControls che non supportano le modifiche collettive?

+6

C'è una classe BulkObservableCollection in Microsoft.VisualStudio.Language. Intellisense.BulkObservableCollection http://msdn.microsoft.com/en-us/library/dd867973.aspx – tofutim

risposta

3

Non penso che ci siano potenziali inconvenienti o problemi, è solo che non è lì. In effetti, scoprirai che la maggior parte dei tipi in 'System.Collections.Generic' non fornisce la funzionalità 'AddRange'.

Nel frattempo, molte persone hanno creato le proprie versioni di "ObservableCollection" per fornire la funzionalità desiderata.INotifyCollectionChanged contiene informazioni sufficienti per i suoi gestori di prendere nota di quando una serie di elementi sono stati interessati probabilmente per questo motivo.

Ultimo ma non meno importante, se si associa una collezione che ha questi 'Gamma' operazioni di tipo troverete che essi lavoreranno con l'interfaccia utente come ci si aspetta

4

Esistono numerose estensioni a ObservableCollection che possono essere trovate su Internet che aggiungono il concetto di aggiungere/rimuovere intervallo, o consentono di rinviare gli aggiornamenti e attivarli manualmente. Per esempio questa domanda Stack Overflow:

ObservableCollection Doesn't support AddRange method, so I get notified for each item added, besides what about INotifyCollectionChanging?

È inoltre possibile implementare un componente aggiuntivo di massa che genera un evento di reset, che farà sì che l'interfaccia utente di ri-rendere tutti gli elementi della collezione:

http://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/

Questi consentono di gestire in modo più efficiente gli aggiornamenti dell'interfaccia utente. Come un ItemsControl gestisce un evento modificato collezione che specifica un elenco di elementi modificati fino al framework WPF stesso. Presumo che gestisca questo in modo intelligente!

Il mio consiglio è, se le prestazioni sono fondamentali per voi e avete collezioni con numerosi articoli in fase di aggiornamento e si verificano problemi di prestazioni, quindi sottoclasse ObservableCollection per gestire la notifica di cambio di raccolta in un modo che meglio si adatta alle esigenze della vostra applicazione.

+0

Una rapida occhiata all'attuazione della domanda collegata mostra un'implementazione inefficiente. In sostanza, l'evento 'CollectionChanged' viene generato per ogni elemento aggiunto, quindi di nuovo per ripristinare la raccolta! –

+1

@KentBoogaart hi Kent, intendi la risposta SO? mi sta bene Il metodo AddRange esegue iterazioni sugli elementi aggiunti, quindi genera un singolo evento CollectionChanged, con un tipo di modifica di "add" che fornisce l'elenco di elementi aggiunti. La formattazione del codice non è così buona però ;-) – ColinE

+1

dato che RangeObservableCollection estende ObservableCollection, chiamando Aggiungi su ogni elemento i risultati del CollectionChangedEvent che viene generato per ogni elemento aggiunto. Quindi tutto lo sforzo va sprecato ripristinando la raccolta dopo aver aggiunto tutti gli elementi. –

2

NotifyCollectionChangedEventArgs include informazioni sull'indice. La rimozione degli oggetti fa sì che gli indici vengano rimescolati, così come l'inserimento di elementi. Quindi, anche se non del tutto impossibile, sarebbe piuttosto difficile e probabilmente inefficiente fornire la capacità di lavorare con intervalli.

+0

L'unica informazione di indice è "l'indice a cui si è verificata la modifica". Questa informazione è facilmente fornita con operazioni di aggiunta e rimozione della gamma. –

+0

@ A.R .: no, cosa succede se rimuovo il primo e l'ultimo elemento della collezione? C'è solo un indice nell'argomento dell'evento, ma sono necessari due indici. –

+0

Esistono due indici. Esiste "NewStartingIndex" e "OldStartingIndex". La descrizione di quest'ultimo riporta "Ottiene l'indice in cui si è verificata un'azione Move, Remove o Replace.", Inoltre, a meno che non si stiano rimuovendo TUTTI gli elementi nella raccolta, lo scenario che si sta descrivendo non è possibile in quanto gli elementi di un intervallo sono contigui. –

1

Ci deve essere un motivo per cui Microsoft non ha fornito loro

Non forniscono ogni possibile pezzo di funzionalità, è (anche) un costo vs. domanda cosa.

È possibile implementare la propria raccolta che supporta operazioni e implementazioni bulk INotifyCollectionChanged.

Sì. E quando lo fai, scoprirai che la collezione dovrà fare delle scelte su come/quando propagare tali cambiamenti. Non ho mai provato ma immagino ci siano alcuni compromessi che View o ViewModel possono prendere su decisioni migliori rispetto a una collezione riutilizzabile.

Problemi correlati