2010-01-25 2 views
20

Wenn der Benutzer eine Spalte sortiert in meinem DataGrid, möchte ich alle Null oder leere Zellen nach unten statt oben sortiert werden.Wie kann ich eine benutzerdefinierte Sortierregel auf ein WPF DataGrid anwenden?

Ich schrieb eine IComparer<T>, die sicherstellt, dass Leerzeichen immer nach unten sortiert werden, aber ich kann nicht herausfinden, wie man es auf die Spalten meiner DataGrid anwenden. Beachten Sie, dass die erste Art der DataGrid, die ich mit der Methode LINQ OrderBy() mache, funktioniert super. Das Problem besteht darin, dass alle nachfolgenden Sortierungen, die vom Benutzer ausgeführt werden, die Leerzeichen nach oben sortieren.

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

Fragen

Wie erhalte ich die DataGridColumn meinen Vergleich zu bedienen? Oder wenn dies nicht möglich ist, können Sie einen Workaround anbieten? Ich hoffe wenn möglich auf eine MVVM-freundliche Lösung.

Antwort

22

das ist, wie ich es tun: ich aus dem Netz tun ableiten all dies innerhalb der Klasse zu halten, so dass ich heften sich an die Sortier Ereignis intern

an Event-Handler anhängen

dataGrid.Sorting += new DataGridSortingEventHandler(SortHandler); 

implementieren das Verfahren (i tue dies in einer abgeleiteten Klasse)

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

Nur eine Notiz, die in Abhängigkeit von der Art der Sammlung Ihres Datagrid gebunden war, müssen Sie möglicherweise das Ergebnis von GetDefaultView auf [eine andere Art] gegossen (http://msdn.microsoft.com/ de-de/library/ms752347.aspx # how_to_create_a_view). – xr280xr

Verwandte Themen