2010-01-25 4 views
20

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.¿Cómo puedo aplicar una regla de clasificación personalizada a WPF DataGrid?

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 inicial del tipo DataGrid, que estoy haciendo con el método 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 consigo el DataGridColumn usar mi comparador? O si esto no es posible, ¿puede ofrecer una solución alternativa? Espero una solución amigable MVVM si es posible.

Respuesta

22

así es como lo hago: Yo derivo de la red para mantener todo esto dentro de la clase, por lo que hay que adjuntar a los controladores de eventos internos

adjuntar al evento de clasificación

dataGrid.Sorting += new DataGridSortingEventHandler(SortHandler); 

aplicar el método (i hacer 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; 
} 
+0

Sólo una nota que, dependiendo del tipo de recopilación de su cuadrícula de datos se une a, puede que tenga que emitir el resultado de GetDefaultView a [un tipo diferente] (http://msdn.microsoft.com/ en-us/library/ms752347.aspx # how_to_create_a_view). – xr280xr

Cuestiones relacionadas