2011-12-19 23 views
10

Quiero especificar un orden predeterminado al inicio, pero todavía permitir que el usuario ordene haciendo clic en los encabezados de las columnas. Lamentablemente, la propiedad SortDirection se ignora cuando está configurada, es decir, obtenemos la flecha de encabezado de columna correcta, pero no se ordena nada.DataGrid SortDirection ignorado

Al hacer clic en los encabezados manualmente, ordena los datos correctamente, por lo que no es la clasificación en sí. Esta es la versión simplificada que estoy usando:

<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> 

Actualización: También he intentado añadir a la SortDescriptions ICollectionView como se propone, sin buenos resultados. ¿Podría esto tener algo que ver con el hecho de que estoy agregando dinámicamente nuevos elementos a la colección? Es decir. al inicio, la lista está vacía y se llena lentamente y tal vez la clasificación se aplica solo una vez.

Respuesta

9

Tome un vistazo a este MSDN Blog

Desde arriba enlace:

DataGridColumn.SortDirection en realidad no ordenar la columna.
DataGridColumn.SortDirection se utiliza para poner en cola la flecha visual en el DataGridColumnHeader para señalar arriba, abajo o para no mostrar. Para ordenar realmente las columnas, además de hacer clic en DataGridColumnHeader, puede establecer DataGrid.Items.SortDescriptions programmatically.

+0

Probé con los dos 'datagrid.Items' y el ICollectionView real que estoy usando, pero los resultados son los mismos: negativo :( – Voo

+0

Pensándolo bien: Tal vez esto algo que ver conmigo dinámicamente agregar nuevos elementos a la lista? – Voo

+0

@Voo es posible que desee ver esto [MSDN Blog] (http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/ c943e22e-5fdf-469d-9e92-fa0167dc9d62) Guarde EssDeialy SortDescription y vuelva a aplicarlo para forzar un recurso. –

4

No tengo ninguna experiencia personal con esto, pero encontré this rather helpful article.

Esencialmente necesita agregar un SortDescription al CollectionViewSource al que está vinculado el DataGrid.

+0

Se crea un CVS y agrega la dirección de ordenación de eso, no ObservableCollection. Los OC usan el método Move para ordenar las filas. – Xcalibur37

+0

@Xcalibur Temo que mi jerga wpf/xaml/sea un poco limitada, ¿podrías traducir eso? De todos modos intenté agregar SortDescriptions tanto a 'datagrid.Items' como a ICollectionView que la cuadrícula de datos usa como fuente sin éxito. – Voo

+0

Aquí también, para que no se pierda: ¿podría tener esto algo que ver conmigo añadiendo dinámicamente nuevos elementos a la lista? – Voo

1

El cortocircuito es que no hay una manera rápida y fácil de hacerlo. Escribí mi propio clasificador personalizado que usa el método Move en ObservableCollections. Anulo el evento "DataGridSorting" y llamo a mis propios métodos para facilitar esto. No voy a publicar el código aquí porque creo que es demasiado exagerado para su pregunta.

Yo diría que me quedo con mi comentario anterior mediante el uso de un CollectionViewSource y una SortDescription (competent_tech originalmente publicado).

2

Este artículo fue muy útil. Pude usarlo para encontrar una solución algo fácil. Aquí hay un fragmento de mi solución que funcionó.

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> 

Código

// 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)); 
     } 
    } 
Cuestiones relacionadas