2013-02-26 11 views
5

Ich habe ein WPF DataGrid mit benutzerdefinierten Sortierung implementiert und es funktioniert gut. Ich muss einige der Datensätze in der Sammlung nach Oben und Unten sperren (Top Lock und Bottom Lock). Wenn also ein bestimmter Datensatz Top-gesperrt ist, sollte er der erste Datensatz in der Auflistung sein, unabhängig von einem Wert für die ausgewählte Spalte (dh ich möchte nicht die Zeilen sortieren, die Top-Locked und Bottom-Locked sind). Hier ist meine benutzerdefinierte Sortiermethode.WPF DataGrid benutzerdefinierte Sortierung mit einigen gesperrten Datensätzen

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; 

     } 

wo LineSorter meine benutzerdefinierte Sorter-Klasse ist mit IComparer Umsetzung. Das funktioniert gut. Jetzt möchte ich Top Lock und Bottom Lock auf die ListCollectionView anwenden. Ich habe den folgenden Code mit dem oben genannten versucht, aber es hat keine Änderung (dh Liste wird nur basierend auf der benutzerdefinierten Sortierspalte sortiert).

Gibt es eine Möglichkeit, dieses Szenario zu tun, oder muss ich die gesperrten Datensätze manuell entfernen und dann hinzufügen. Bitte schlagen Sie vor ..

+1

können Sie die drei verschiedenen Sammlungen erstellen und verbinden.Eine Sammlung wird Top-Lock haben, zweite haben Bodenschloss und dritte Sammlung wird Ruhe alle Elemente haben. –

+3

Ändern Sie Ihre 'LineSorter.Compare()' -Implementierung, um Objekte mit der höchsten Sperre immer als weniger als andere Objekte und Objekte mit der unteren Sperre als größer als andere Objekte zurückzugeben. Ich nehme an, dass es einen Grund gibt, warum du das nicht tun kannst? –

Antwort

0

Gut. Sie können dies über Ihren Code erreichen.

Let'a nehmen

The page size   = 10 

Current page   = 2 

Collection name  = myItems 

First Item to display = initialItem 

Last Item to display = lastItem 

Schritte:

  • sortieren die Sammlung
  • Nehmen 9 bis 16 Punkte (8 Titel) aus der Sammlung (Weil Sie auf der zweiten Seite)

Anfangsartikelnummer = 8 x (aktuelle Seitennummer -1) + 1 letztes Element

Nummer = 8 x aktuelle Seitennummer

So:

Anfangsartikelnummer = 8 x (2 - 1) + 1 = 9

letzte Artikelnummer = 8 x 2 = 16

(jetzt haben Sie eine Teilsammlung von 8 Gegenstände, die sortiert sind)

  • hinzufügen intialItem an die Spitze der Unter Sammlung

myItems.Insert (0, initialItem);

  • hinzufügen lastItem bis zum Ende der Untersammlung

    myItems.Insert (9, lastItem);