2010-01-25 20 views
20

Kullanıcı benim DataGrid'umda bir sütun sıralamasında, tüm boş veya boş hücrelerin en üste değil, altına sıralanmasını istiyorum.WPF DataGrid'e özel sıralama kuralı nasıl uygularım?

IComparer<T> numaralı belgede, boşlukların her zaman aşağı sıralanmasını sağlayan bir yazı yazdım, ancak bunu DataGrid numaralı sütununun sütunlarına nasıl uygulayacağımı anlayamıyorum. LINQ OrderBy() yöntemiyle yaptığım DataGrid numaralı ilk türünün, harika çalıştığını unutmayın. Sorun, kullanıcı tarafından gerçekleştirilen sonraki tüm sıraların boşlukları en üste sıralamasıdır.

Comparer Kod

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

Sorular

nasıl karşılaştırıcısı kullanmak DataGridColumn alabilirim? Ya da bu mümkün değilse, bir geçici çözüm önerebilir misiniz? Mümkünse MVVM dostu bir çözüm bekliyorum. içten

dataGrid.Sorting += new DataGridSortingEventHandler(SortHandler); 

uygulamak sıralama olayına bağlamak ben sınıf içinde tüm bu tutmak için ızgara kaynaklanıyor, bu yüzden ben olay işleyicileri eklemek:

cevap

22

bu i böyle yaparız yöntem, (i türetilmiş bir sınıf bunun)

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

(http://msdn.microsoft.com/ en-us/kütüphane/ms752347.aspx # how_to_create_a_view). – xr280xr

3

ekli davranışların kullanan bu sorun için bir çözüm MVVM sahiptir. Kodu arkada kullanmayı tercih ederseniz, @ Aran'ın çözümü de hile yapacak. sizin DataGrid bağlandı koleksiyon türüne bağlı olarak, [A Different Tipi] olarak GetDefaultView sonucunu döküm gerekebilir Sadece bir not

https://stackoverflow.com/a/18218963/2115261