2013-02-26 17 views
5

Mam WPF DataGrid z zaimplementowanym niestandardowym sortowaniem i działa dobrze. Muszę zablokować niektóre rekordy w kolekcji do góry i dołu (górna blokada i dolna blokada). Jeśli więc dany rekord jest zablokowany na górze, powinien to być pierwszy rekord w kolekcji, niezależnie od wartości dla wybranej kolumny (tj. Nie chcę sortować tych wierszy, które są zablokowane na górze, a dolne zablokowane). Oto moja niestandardowa metoda sortowania.Niestandardowe sortowanie WPF DataGrid z pewnymi rekordami zablokowanymi

private void PerformLineCustomSort(DataGridColumn column) 
     { 
      ListSortDirection direction = (column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending; 
      column.SortDirection = direction; 
      ListCollectionView listCollectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(Lines); 

      LineSorter lineSort = new LineSorter(direction, column); 
      listCollectionView.CustomSort = lineSort; 

     } 

gdzie LineSorter jest mój zwyczaj klasa sorter z IComparer realizacji. To działa dobrze. Teraz chcę zastosować Top lock i Bottom lock do ListCollectionView. Próbowałem powyższego kodu z powyższym, ale nie ma żadnych zmian (np. Lista jest sortowana na podstawie tylko kolumna sortowania niestandardowego).

listCollectionView.SortDescriptions.Add(new SortDescription("TopLock", ListSortDirection.Descending)); 
listCollectionView.SortDescriptions.Add(new SortDescription("BotLock", ListSortDirection.Ascending)); 

Czy istnieje sposób na wykonanie tego scenariusza lub czy muszę ręcznie usunąć, a następnie dodać zablokowane rekordy. Proszę zasugerować ..

+1

możesz utworzyć trzy różne kolekcje i połączyć je.jedna kolekcja będzie miała górny zamek, drugi dolny zamek, a trzecia będzie miała wszystkie elementy. –

+3

Zmień swoją implementację 'LineSorter.Compare()' tak, aby zawsze zwracać najbardziej zablokowane elementy jako mniej niż inne elementy, a dolne elementy jako większe niż inne elementy. Zakładam, że istnieje powód, dla którego nie możesz tego zrobić? –

Odpowiedz

0

Cóż. Możesz to zrobić ze swojego kodu.

Let'a zakładać

The page size   = 10 

Current page   = 2 

Collection name  = myItems 

First Item to display = initialItem 

Last Item to display = lastItem 

kroki:

  • posortować kolekcję
  • Take 9 do 16 pozycji (8 pozycji) z kolekcji (Bo jesteś na drugiej stronie)

początkowa pozycja = numer 8 x (bieżący numer strony -1) + 1 ostatni element

= numer 8 x aktualny numer strony

Więc:

początkowa liczba pozycja = 8 x (2 - 1) + 1 = 9

Ostatnia pozycja = 8 x 2 = 16

(teraz masz subcollection 8 elementów, które są klasyfikowane)

  • Dodaj intialItem do górnej części kolekcji sub

myItems.Insert (0, initialItem);

  • Dodaj lastItem na koniec zbierania sub

    myItems.Insert (9, lastItem);