Датагрид: Нет отсортированных событий? - PullRequest
7 голосов
/ 05 марта 2012

Мне нужно знать, когда WPF Datagrid был отсортирован пользователем. Почему нет события Sorted? Я могу найти только событие сортировки.

Я также исследовал CollectionView и ListCollectionView, которые открывают объекты для просмотра без какой-либо удачи.

Я весьма удивлен, поскольку это должно выйти из коробки. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 01 марта 2017

Я взял пример из документации MSDN и настроил его так, чтобы оно вызывало событие Sorted после завершения события Sorting.

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();
    }
}

Тогда вы можете использовать его в коде позади.

datagrid.Sorted += new RoutedEventHandler(datagrid_Sorted);

или в XAML

<local:CustomDataGrid x:Name="datagrid" Sorted="datagrid_Sorted;"/>
2 голосов
/ 03 апреля 2012

сетка данных имеет событие "Сортировка", подпишитесь на него!

XAML:

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

.cs код:

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));
}
0 голосов
/ 11 октября 2018

Вы все еще можете подписаться на событие сортировки DataGrid:

<local:CustomDataGrid x:Name="datagrid" Sorting="datagrid_Sorted;"/>

, но чтобы убедиться, что ваши действия произойдут после выполнения сортировки, используйте Dispatcher:

private void DataGrid_Sorting(object sender, DataGridSortingEventArgs e)
{

    this.Dispatcher.BeginInvoke((Action)delegate()
    {
        //runs after sorting is done
    }, null);
}

Таким образом,нет необходимости в специальном классе Datagrid.

...