DataGrid:没有排序事件吗?

10
我需要知道用户何时对WPF数据网格进行了排序。为什么没有"Sorted"事件?我只能找到一个"Sorting"事件。
我还调查了CollectionView和ListCollectionView,它们向视图公开对象,但没有什么运气。
我感到非常惊讶,因为这应该是开箱即用的功能。有什么想法吗?

MSDN可能是一个更好的地方来询问“为什么”。 - Jake Berger
处理排序并将其传递给数据网格。 - paparazzo
处理排序?你是指排序吗? - Houman
4
请查看此帖子:排序事件 - Oliver Dufner
3个回答

5

您仍然可以订阅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类了。

这是一个非常简单而且很棒的解决方案,它运行良好,谢谢。 - mrherkar

5

我从MSDN文档中选取了一个示例,并进行了调整,使其在排序事件完成后触发Sorted事件。

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

这里是datagrid完成排序时触发的方法:

private void datagrid_Sorted(object sender, RoutedEventArgs args)
{
     var datagrid = (CustomDataGrid)sender;
     var sortedItems = datagrid.Items;

}

2

datagrid有“Sorting”事件,订阅它!

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

14
这不是正确的答案。OP明确表示他想要一个已排序(Sorted)的事件,而不是正在排序(Sorting)的事件。Oliver Dufner的评论指向一个重复问题,是正确的回应。 - Wallace Kelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接