Come posso applicare una regola di ordinamento personalizzata a un DataGrid WPF?

Quando l’utente fa un ordinamento di colonna nel mio DataGrid , voglio che tutte le celle nulle o vuote siano ordinate in basso, piuttosto che in alto.

Ho scritto un IComparer che assicura che gli spazi vuoti siano sempre ordinati verso il basso, ma non riesco a capire come applicarlo alle colonne del mio DataGrid . Si noti che l’ordinamento iniziale di DataGrid , che sto facendo con il metodo LINQ OrderBy() , funziona alla grande. Il problema è che tutti gli ordinamenti successivi eseguiti dall’utente selezionano gli spazi in alto.

Codice Comparatore

 public class BlankLastStringComparer : IComparer { public int Compare(string x, string y) { if (string.IsNullOrEmpty(x) && !string.IsNullOrEmpty(y)) return 1; else if (!string.IsNullOrEmpty(x) && string.IsNullOrEmpty(y)) return -1; else return string.Compare(x, y); } } 

Domande

Come posso ottenere DataGridColumn per utilizzare il mio comparatore? O se questo non è ansible, puoi offrire una soluzione alternativa? Sto sperando in una soluzione amichevole MVVM se ansible.

questo è il modo in cui lo faccio: io derivano dalla griglia per mantenere tutto ciò all’interno della class, quindi li allego internamente ai gestori di eventi

albind all’evento di smistamento

 dataGrid.Sorting += new DataGridSortingEventHandler(SortHandler); 

implementare il metodo (lo faccio in una class derivata)

 void SortHandler(object sender, DataGridSortingEventArgs e) { DataGridColumn column = e.Column; IComparer comparer = null; //i do some custom checking based on column to get the right comparer //i have different comparers for different columns. I also handle the sort direction //in my comparer // prevent the built-in sort from sorting e.Handled = true; ListSortDirection direction = (column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending; //set the sort order on the column column.SortDirection = direction; //use a ListCollectionView to do the sort. ListCollectionView lcv = (ListCollectionView)CollectionViewSource.GetDefaultView(this.ItemsSource); //this is my custom sorter it just derives from IComparer and has a few properties //you could just apply the comparer but i needed to do a few extra bits and pieces comparer = new ResultSort(direction); //apply the sort lcv.CustomSort = comparer; } 

Ho una soluzione MVVM per questo problema che fa uso di comportamenti collegati. Se preferisci usare code-behind, la soluzione di @ Aran farà anche il trucco.

https://stackoverflow.com/a/18218963/2115261