2011-04-07 29 views
5

2 sütuna göre sıralamak istediğim bir ListView (GridView) var, bu yüzden 2 + öğeleri Sütun 1'de aynı değere sahipse, 2 sütununa göre sıralar. kolay. Fakat boş dizeler A-Z'yi sıralarken en üstte görünür. Onları dibe doğru taşımak istiyorum. Bununla ilgilenen bir karşılaştırıcı (IComparer) yaptım, ama nasıl kullanacağımı bilmiyorum.WPF - Birden çok sütuna göre sıralanırken özel bir karşılaştırıcı kullanma

İşte denedim kod:

Dim view As ListCollectionView = CollectionViewSource.GetDefaultView(myCollection) 
Using view.DeferRefresh 
    view.SortDescriptions.Clear() 
    view.SortDescriptions.Add(New SortDescription(sortHeader.Header, direction)) 
    view.SortDescriptions.Add(New SortDescription(otherColumn, direction)) 
    view.CustomSort = New MyComparer() 
End Using 

sorun benim karşılaştırıcısı göre sıralanmakta olan benim sınıfın bir tür yerine mülkiyet/sütunun değerini verilir olduğunu. Öyleyse eğer sınıf Foo'yduysa ve Foo.Bar tarafından sıralıyorum, tüm Foo sınıfını aldım, sadece Bar'ın değerini değil.

Karşılaştırıcım, hangi özelliklerin karşılaştırılacağını nasıl bilecek? Belki burada yanlış bir şey yapıyorum, çünkü bu hiç mantıklı değil. X ve y için bir dize (özellik türü) almayı bekledim ...

Bunu nasıl yapacağını bilen var mı?

Sizin IComparer uygulama tüm nesne verilecektir

cevap

6

, muhtemelen böyle bir şey yaparak, tıklandığında hangi sütunun anlamaya ihtiyacımız:

this.AddHandler(GridViewColumnHeader.ClickEvent, 
       new RoutedEventHandler(Column_Sort)); 

ve sonra muhtemelen yapıcı değiştirerek senin MyComparer içine beslemek özellik yoluna girmek.

Column_Sort size ben fi üzerinde beceremiyorum (böyle mülkiyet yolu şey elde edebilirsiniz, ancak C# Bu yapacağını.

void Column_Sort(object sender, RoutedEventArgs e) 
{ 
    var memberBinding= ((GridViewColumnHeader)e.OriginalSource).Column.DisplayMemberBinding; 
    var path = ((Binding)memberBinding).Path.Path; 
} 

ve sonra sıralama mantığı içine beslemek

Dim view As ListCollectionView = CollectionViewSource.GetDefaultView(myCollection) 
Using view.DeferRefresh 
    view.SortDescriptions.Clear() 
    view.SortDescriptions.Add(New SortDescription(sortHeader.Header, direction)) 
    view.SortDescriptions.Add(New SortDescription(otherColumn, direction)) 
    view.CustomSort = New MyComparer(PropertyPath) 
End Using 

DÜZENLEME: sadece özelleştirmek gerekir senin IComparer birden sütun sıralamayı destekleyen, ben googled ve this comparer implementation bunu besleyebilir Severa bulundu l mülkiyet yolları böyle virgülle ayırarak ve ASC/DESC ile sonlandırılmış:

User.LastName DESC, User.FirstName DESC 

Ben kadarıyla UI söz konusu olduğunda sıralama çoklu sütun için kongre Eğer Ctrl düğme düzenlenen olması gerektiğini düşünüyorum. Bu yüzden ListView sınıfını alt sınıflara ayırın ve GridViewColumnHeader tıklama etkinliğine ve hangi sütunların tıklatılıp tıklanmadığını öğrenmek için KeyDown olayına bağlayın ve ardından bunu beslemek için bir IComparer uygulamasını kullanın.

+0

Bu, bir sütuna göre sıralanırken çalışır, ancak PropertyPath tıklatılan sütuna başvurduğundan (kodumda ayrıca sortHeader), ikinci sütunu (ikinci SortDescription) karşılaştırdığında bile bu sütuna bakar.). Karşılaştırıcı, ilk sütuna (tıklanan) veya ikincisine (sütun 1'de aynı değere sahip 2+ olduğunda) bakması gerektiğini nasıl anlar? – grant

+0

Yukarıdaki soruyu cevaplamak için yukarıdaki bazı değişiklikleri yaptım :) – Jose

İlgili konular