Bump di un vecchio post, ma solo creazione di una nuova classe di raccolta che eredita da ListViewCollection e Overrides OnPropertyChanged (per un IBindingList, gli eventi ListChanged conterranno la modifica della proprietà nel parametro ListChangedEventArgs).E assicurati che gli elementi all'interno della raccolta implementino e utilizzino INotifyPropertyChange ogni volta che una proprietà cambia (sollevata da te), o la collezione non si legherà alle modifiche delle proprietà.
Quindi in questo metodo OnPropertyChanged, il mittente sarà l'elemento. Rimuovi l'oggetto se - e solo se - una proprietà che causerebbe la modifica di un resort, quindi aggiungila nuovamente (inseriscila in posizione ordinata se aggiungerla non lo fa già). Spostare un oggetto è preferibile se è disponibile invece di rimuoverlo/aggiungerlo. Allo stesso modo, questo dovrebbe essere fatto anche con il filtraggio (controllando il predicato del filtro).
IEditableObject non è necessario! Se si desidera modificare diverse proprietà, quindi terminare la modifica (come la modifica di 3 proprietà e quindi la selezione su una riga diversa in WinForm DataGridView), dopo averlo ordinato, questo sarebbe il metodo corretto per farlo funzionare. Ma molte volte vorrete probabilmente che la collezione ricorra dopo aver cambiato ogni proprietà senza dover chiamare manualmente BeginEdit/EndEdit. IEditableObject, btw, è presente nel framework .NET 2.0 e non è nuovo su .NET 3.5 (se leggi l'articolo del Dr).
Nota: i problemi possono verificarsi utilizzando BeginEdit() e EndEdit() con più modifiche allo stesso elemento, a meno che non si incrementi (per vero)/decremento (per falso) un intero invece di impostare un booleano! Ricordati di incrementare/decrementare un numero intero per sapere veramente quando il montaggio è finito.
La conservazione di un elenco ordinato in modo permanente richiede molto tempo ed è soggetta a errori (e può interrompere il contratto di inserimento se si forzano gli inserimenti ordinati) e deve essere utilizzata solo in determinati luoghi, ad esempio ComboBox. Su qualsiasi griglia, questa è una pessima idea, poiché la modifica di una riga lo farà ricadere da sotto la posizione corrente degli utenti.
Public Class ListView
Inherits ListCollectionView
Protected Overrides Sub OnPropertyChanged(sender As Object, e As PropertyChangedEventArgs)
' Add resorting/filtering logic here.
End Sub
End Class
Il miglior esempio in una collezione che fa simile a quello che vi serve è Jesse Johnsons ObjectListView, anche se questo è NET 2.0 specifica (IBindingList invece di INotifyCollectionChanged/ObservableCollection/ListCollectionView) e utilizza una licenza molto restrittiva. Il suo blog potrebbe essere ancora molto prezioso nel modo in cui ha realizzato questo.
Edit:
dimenticato di aggiungere che Mittente sarà la voce è necessario ricorrere, e e.PropertyName è quello che sarà necessario utilizzare per determinare se rientra nei SortDescriptions. In caso contrario, una modifica a tale proprietà non comporterà la necessità di un resort. Se e.PropertyName è Nothing, quindi è proprio come un aggiornamento, in cui molte proprietà potrebbero essere cambiate e il ricorso dovrebbe essere fatto.
Per determinare se è necessario filtrarlo, è sufficiente eseguirlo attraverso FilterPredicate e rimuoverlo se necessario. Il filtraggio è molto meno costoso dell'ordinamento.
Speriamo disponibile,
TamusJRoyce
Il link è morto. Nuovo: http: // drwpf .com/blog/2008/10/20/itemscontrol-e-is-for-editable-collection/ – Gman
@Gman, grazie, ho aggiornato il collegamento nella risposta –