WPF ListView - Ordinamento per proprietà nidificate
-
19-09-2019 - |
Domanda
Di recente mi sono imbattuto in un problema in cui il WPF ListView
Il controllo sembra limitare la capacità di ordinare i suoi oggetti. In particolare, sto avendo un sacco di difficoltà a cercare di ottenere un SortDescription
riconoscere le proprietà nidificate (proprietà delle proprietà).
Per l'ordinamento diretto per proporzioni, la seguente riga dovrebbe fare il lavoro:
listView.Items.SortDescriptions.Add(new SortDescription("MyProperty",
ListSortDirection.Ascending));
E in effetti funziona bene per me. Tuttavia, perché il ItemSource
per me ListView
è un (fortemente tipo) DataTable
, alcune delle colonne sono legate alle proprietà nidificate della riga (cioè Row.OtherTableRow.SubProperty
Stile percorso di associazione) - È il modo in cui i set di dati Ado.NET funzionano per i database gerarchici.
Quello che vorrei fare è qualcosa del genere:
listView.Items.SortDescriptions.Add(new SortDescription("MyProperty.SubProperty",
ListSortDirection.Ascending));
Ma sfortunatamente quella linea lancia un ArgumentException
:
Il tipo di "ordini" non ha proprietà denominate "riga. [Id], quindi non è possibile ordinare la raccolta dei dati.
Stranamente, non ho problemi di rilegatura per le proprietà nidificate. In effetti, i campi mostrano perfettamente bene nel ListView
... né l'aggiunta di un PropertyGroupDescription
a listView.GroupDescriptions
dammi qualche problema con le proprietà nidificate - è solo SortDescriptions
!
È questo ma una limitazione di WPF/il ListView
controllo? C'è un modo per ottenere supporto come parte del framework o sarò sfortunato lì? Se sfortunatamente lo sono, e questa incoerenza è inevitabile, apprezzerei molto se qualcuno potesse suggerire un hack o una soluzione alternativa per questo scenario di proprietà nidificate. Ho già provato alcune idee, ma tutte con un successo minimo.
Nota: mi rendo conto che un ORM potrebbe risolvere i miei problemi, ma temo che questo non sia affatto possibile per l'attuale progetto su cui sto lavorando. I set di dati ADO.NET semplici dovranno fare.
Soluzione
Secondo Windows Presentation Foundation Unleased (Adam Nathan), è possibile lanciare la vista predefinita a un ListCollectionView e impostare un'implementazione personalizzata ICOMparer sulla sua proprietà CustomSort.