2010-01-25 10 views
20

Gdy użytkownik wykonuje sortowanie kolumn w moim DataGrid, chcę, aby wszystkie puste lub puste komórki były sortowane na dole, a nie na górze.Jak zastosować niestandardową regułę sortowania do elementu DataFrid WPF?

Napisałem IComparer<T>, który zapewnia, że ​​spacje są zawsze sortowane w dół, ale nie mogę wymyślić, jak zastosować go do kolumn mojego DataGrid. Zauważ, że początkowy rodzaj DataGrid, który robię z metodą LINQ OrderBy(), działa świetnie. Problem polega na tym, że wszystkie kolejne sortowania wykonywane przez użytkownika sortują puste pola do góry.

Kod porównywarka

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); 
    } 
} 

Pytania

Jak mogę uzyskać DataGridColumn używać mojego porównywarka? A jeśli nie jest to możliwe, czy możesz zaproponować obejście? Mam nadzieję na przyjazne dla MVVM rozwiązanie, jeśli to możliwe.

Odpowiedz

22

to jak to zrobić: Mam czerpać z sieci, aby utrzymać to wszystko w środku klasy, więc załączam do obsługi zdarzeń wewnętrznie

dołączyć do wydarzenia sortowania

dataGrid.Sorting += new DataGridSortingEventHandler(SortHandler); 

wdrożenia metoda (robię to w klasie pochodnej)

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

Tylko uwaga, że ​​w zależności od rodzaju kolekcji Twój DataGrid musiało, być może trzeba będzie rzucić wynik GetDefaultView do innego typu [] (http://msdn.microsoft.com/ en-us/library/ms752347.aspx # how_to_create_a_view). – xr280xr

Powiązane problemy