2012-03-05 20 views
7

Necesito saber cuando un WPF Datagrid ha sido ordenado por el usuario. ¿Por qué no hay un evento Sorted? Solo puedo encontrar un evento de clasificación.Datagrid: ¿No hay ningún evento ordenado?

También investigué el CollectionView y ListCollectionView que está exponiendo los objetos a la Vista, sin suerte.

Estoy bastante sorprendido de que esto salga de la caja. Alguna idea?

+0

MSDN puede haber un mejor lugar para preguntar "por qué". –

+0

Manejar Ordenar y simplemente pasar ordenar a DataGrid. – Paparazzi

+0

manejar ordenar? ¿Te refieres a clasificar? – Houman

Respuesta

1

datagrid tiene el evento "Ordenar", suscríbase a él!

XAML:

<DataGrid ItemsSource="{Binding YourItems}" AutoGenerateColumns="True" anUserSortColumns="True" 
      Sorting="DataGrid_Sorting"/> 

.cs código:

private void DataGrid_Sorting(object sender, System.Windows.Controls.DataGridSortingEventArgs e) 
{ 
    Console.WriteLine(string.Format("sorting grid by '{0}' column in {1} order", e.Column.SortMemberPath, e.Column.SortDirection)); 
} 
+1

esto definitivamente debería haber sido aceptado – Jonesopolis

+3

Esta no es la respuesta correcta. OP dice específicamente que quiere un evento ordenado, no un evento de clasificación. La diferencia es si los artículos ya han sido ordenados. El comentario de Oliver Dufner apunta a una [pregunta duplicada] (http://stackoverflow.com/questions/8416961/how-can-i-be-notified-if-a-datagrid-column-is-sorted-and-not-sorting) es la respuesta correcta. – Wally

1

Me he tomado un ejemplo de MSDN documentation y ajusté para criar a un evento Ordenado cuando se realiza el evento de clasificación.

public class CustomDataGrid : DataGrid 
{ 
    // Create a custom routed event by first registering a RoutedEventID 
    // This event uses the bubbling routing strategy 
    public static readonly RoutedEvent SortedEvent = EventManager.RegisterRoutedEvent(
     "Sorted", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(CustomDataGrid)); 

    // Provide CLR accessors for the event 
    public event RoutedEventHandler Sorted 
    { 
     add { AddHandler(SortedEvent, value); } 
     remove { RemoveHandler(SortedEvent, value); } 
    } 

    // This method raises the Sorted event 
    void RaiseSortedEvent() 
    { 
     RoutedEventArgs newEventArgs = new RoutedEventArgs(CustomDataGrid.SortedEvent); 
     RaiseEvent(newEventArgs); 
    } 

    protected override void OnSorting(DataGridSortingEventArgs eventArgs) 
    { 
     base.OnSorting(eventArgs); 
     RaiseSortedEvent(); 
    } 
} 

Luego puede usarlo en codebehind.

datagrid.Sorted += new RoutedEventHandler(datagrid_Sorted); 

o en XAML

<local:CustomDataGrid x:Name="datagrid" Sorted="datagrid_Sorted;"/> 
Cuestiones relacionadas