When the user does a column sort in my DataGrid
, I want all null or empty cells to be sorted to the bottom, rather than the top.
I wrote an IComparer<T>
that makes sure blanks are always sorted downward, but I can't figure out how to apply it to the columns of my DataGrid
. Note that the initial sort of the DataGrid
, which I'm doing with the LINQ OrderBy()
method, works great. The problem is that all subsequent sorts performed by the user sort the blanks to the top.
Comparer Code
public class BlankLastStringComparer : IComparer<string> { 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); } }
Questions
How do I get the DataGridColumn
to use my comparer? Or if this is not possible, can you offer a workaround? I'm hoping for an MVVM friendly solution if possible.
WPF DataGrid (SfDataGrid) allows you to sort the data against one or more columns either in ascending or descending order. The sorting can be performed by clicking a column header. You can enable/disable the sorting for all the columns in DataGrid by using DataGrid. AllowSorting property.
To filter items in a DataGridAdd a handler for the CollectionViewSource. Filter event. In the Filter event handler, define the filtering logic. The filter will be applied every time the view is refreshed.
A Grid is a control for laying out other controls on the form (or page). A DataGrid is a control for displaying tabular data as read from a database for example.
this is how i do it : I do derive from the grid to keep all of this inside the class, so i attach to event handlers internally
attach to the sorting event
dataGrid.Sorting += new DataGridSortingEventHandler(SortHandler);
implement the method (i do this in a derived class)
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; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With