2013-02-26 12 views
5

Ho un Datagrid WPF con l'ordinamento personalizzato implementato e funziona correttamente. Devo bloccare alcuni dei record nella raccolta su Alto e Basso (Blocco superiore e Blocco inferiore). Quindi, quando un particolare record è Top bloccato, dovrebbe essere il primo record della collezione indipendentemente da qualsiasi valore per la colonna selezionata (cioè non voglio ordinare quelle righe che sono Bloccato in alto e Bloccato in basso). Ecco il mio metodo di ordinamento personalizzato.WPF DataGrid ordinamento personalizzato con alcuni record bloccati

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; 

     } 

dove LineSorter è la mia classe selezionatrice personalizzato con IComparer attuazione. Funziona bene Ora voglio applicare il blocco superiore e il blocco inferiore a ListCollectionView. Ho provato il seguente codice con quanto sopra, ma non ha alcun cambiamento (cioè l'elenco è ordinato in base solo alla colonna di ordinamento personalizzata).

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

C'è qualche modo di fare questo scenario o ho bisogno di rimuovere manualmente e quindi aggiungere i record bloccati. Si prega di suggerire ..

+1

è possibile creare le tre diverse raccolte e unirlo.una raccolta avrà il blocco superiore, la seconda avrà il blocco inferiore e la terza raccolta avrà resto tutti gli elementi. –

+3

Modifica l'implementazione di 'LineSorter.Compare()' per restituire sempre gli articoli bloccati in alto meno degli altri articoli e gli oggetti in basso a sinistra come maggiori di altri elementi. Suppongo che ci sia un motivo per cui non puoi farlo anche tu? –

risposta

0

Bene. Puoi farlo accadere dal tuo codice.

Let'a assumere

The page size   = 10 

Current page   = 2 

Collection name  = myItems 

First Item to display = initialItem 

Last Item to display = lastItem 

Passi:

  • Ordina la raccolta
  • Prendere 9 a 16 elementi (8 articoli) dalla collezione (Perché tu sei nella seconda pagina)

voce iniziale numero = 8 x (numero di pagina corrente -1) + 1 ultimo elemento

numero = 8 x pagina corrente numero

Quindi:

numero elemento iniziale = 8 x (2 - 1) + 1 = 9

ultimo numero articolo = 8 x 2 = 16

(ora avete un sottoinsieme di 8 articoli, che sono allineati)

  • Aggiungere intialItem al top della collezione sub

myItems.Insert (0, initialItem);

  • Aggiungere lastItem alla fine della raccolta sub

    myItems.Insert (9, lastItem);