2011-12-19 13 views
10

Desidero specificare un ordinamento predefinito all'avvio, ma consentire comunque all'utente di ordinare facendo clic sulle intestazioni delle colonne. Purtroppo la proprietà SortDirection viene ignorata quando viene impostata, ad esempio la freccia dell'intestazione della colonna corretta, ma nulla viene ordinato.DataGrid SortDirection ignorato

Fare clic sulle intestazioni manualmente, ordina i dati correttamente, quindi non è l'ordinamento stesso. Questa è la versione semplificata che sto utilizzando:

<DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=CurrentView}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Header 1" Binding="{Binding ApplicationName}"/> 
     <DataGridTextColumn Header="Header 2" 
       Binding="{Binding TotalTime}" SortDirection="Descending"/> 
    </DataGrid.Columns> 
</DataGrid> 

Update: Ho anche provato ad aggiungere SortDescriptions al ICollectionView come proposto, senza buoni risultati. Questo potrebbe avere qualcosa a che fare con il fatto che sto aggiungendo in modo dinamico nuovi elementi alla collezione? Cioè all'avvio l'elenco è vuoto e lentamente riempito e forse la descrizione del tipo viene applicata solo una volta?

risposta

9

Date un'occhiata a questo MSDN Blog

Dall'alto link:

DataGridColumn.SortDirection in realtà non ordinare la colonna.
DataGridColumn.SortDirection viene utilizzato per accodare la freccia visiva in DataGridColumnHeader per puntare verso l'alto, verso il basso o per non mostrare. Per ordinare effettivamente le colonne diverse da fare clic su DataGridColumnHeader, è possibile impostare DataGrid.Items.SortDescriptions a livello di programmazione.

+0

Provato che entrambi con 'datagrid.Items' e l'attuale ICollectionView che sto usando, ma i risultati sono entrambi uguali: negativo :( – Voo

+0

Ripensandoci: forse questo ha qualcosa a che fare con me aggiungendo dinamicamente nuovi elementi alla lista? – Voo

+0

@Voo potresti voler dare un'occhiata a questo [blog MSDN] (http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/ c943e22e-5fdf-469d-9e92-fa0167dc9d62) Essentialy salva SortDescription e lo riapplica per forzare un resort –

4

Non ho alcuna esperienza personale con questo, ma ho trovato this rather helpful article.

In sostanza è necessario aggiungere un SortDescription a CollectionViewSource a cui è associato il DataGrid.

+0

Si crea un CVS e aggiungere la direzione di ordinamento a quello, non l'ObservableCollection. OC usa il metodo Move per ordinare le righe. – Xcalibur37

+0

@Xcalibur Temo che il mio wpf/xaml/qualunque linguaggio sia un po 'limitato, quindi potresti tradurlo? Ad ogni modo ho provato ad aggiungere SortDescriptions sia a 'datagrid.Items' che a ICollectionView che il datagrid sta usando come sorgente senza successo. – Voo

+0

Anche qui, quindi non è perso: questo potrebbe avere qualcosa a che fare con me aggiungendo dinamicamente nuovi elementi alla lista? – Voo

1

In breve, non esiste un modo semplice e veloce per farlo. Ho scritto il mio sorter personalizzato che utilizza il metodo Move su ObservableCollections. Sovrascrivo l'evento "DataGridSorting" e chiamo i miei metodi per facilitare questo. Non ho intenzione di pubblicare il codice qui perché penso che sia troppo esagerato per la tua domanda.

Direi di continuare con il mio commento precedente utilizzando CollectionViewSource e SortDescription (competent_tech pubblicato in origine).

2

Questo articolo è stato di grande aiuto. Sono stato in grado di usarlo per trovare una soluzione un po 'facile. Ecco un frammento della mia soluzione che ha funzionato.

XAML

 <DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
      AutoGenerateColumns="False" ItemsSource="{Binding LogLister.Logs}"    
      IsReadOnly="True" > 

      <DataGrid.Columns>     

       <DataGridTextColumn Binding="{Binding TimeStampLocal}" Header="Time" x:Name="ColTimeStamp" /> 

       <DataGridTextColumn Binding="{Binding Text}" Header="Text"/> 
      </DataGrid.Columns> 
     </DataGrid> 

Codice

// Using a DependencyProperty as the backing store for ViewModel. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ViewModelProperty = 
     DependencyProperty.Register("ViewModel", typeof(LogViewerViewModel), typeof(LogViewerControl), 
      new UIPropertyMetadata(null,pf_viewModelChanged)); 

    private static void pf_viewModelChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     var control = (LogViewerControl)o; 

     control.ColTimeStamp.SortDirection = ListSortDirection.Descending; 

     var vm = e.NewValue as LogViewerViewModel; 

     if (vm != null) 
     { 
      ICollectionView collectionView = CollectionViewSource.GetDefaultView(vm.LogLister.Logs); 
      collectionView.SortDescriptions.Add(new SortDescription("TimeStampLocal", ListSortDirection.Descending)); 
     } 
    }