¿Cómo puedo aplicar una regla de clasificación personalizada a WPF DataGrid?
xaml sorting (2)
Cuando el usuario ordena una columna en mi DataGrid
, quiero que todas las celdas vacías o nulas se clasifiquen en la parte inferior, en lugar de en la parte superior.
Escribí un IComparer<T>
que asegura que los espacios en blanco siempre estén ordenados hacia abajo, pero no puedo encontrar la forma de aplicarlo a las columnas de mi DataGrid
. Tenga en cuenta que el tipo inicial de DataGrid
, que estoy haciendo con el OrderBy()
LINQ OrderBy()
, funciona muy bien. El problema es que todos los géneros subsiguientes realizados por el usuario clasifican los espacios en blanco en la parte superior.
Código Comparer
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);
}
}
Preguntas
¿Cómo obtengo el DataGridColumn
para usar mi comparer? O si esto no es posible, ¿puede ofrecer una solución alternativa? Espero una solución amigable MVVM si es posible.
Tengo una solución MVVM para este problema que hace uso de comportamientos adjuntos. Si prefieres usar el código subyacente, la solución de @ Aran también hará el truco.
https://.com/a/18218963/2115261
así es como lo hago: sí provengo de la grilla para mantener todo esto dentro de la clase, así que me apego a los manejadores de eventos internamente
adjuntar al evento de clasificación
dataGrid.Sorting += new DataGridSortingEventHandler(SortHandler);
implementar el método (hago esto en una clase derivada)
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;
}