【问题标题】:Datagrid : Is there no Sorted event?Datagrid:没有排序事件吗?
【发布时间】:2012-03-05 17:32:35
【问题描述】:

我需要知道用户何时对 WPF Datagrid 进行了排序。为什么没有Sorted 事件?我只能找到一个排序事件。

我还调查了将对象暴露给视图的CollectionViewListCollectionView,但没有任何运气。

我很惊讶,因为这应该是开箱即用的。 有什么想法吗?

【问题讨论】:

  • MSDN 可能是问“为什么”的更好地方。
  • 处理排序并将排序传递给 DataGrid。
  • 处理排序?你是说排序?
  • 请看这篇文章。 [排序事件][1] [1]:stackoverflow.com/questions/8416961/…

标签: wpf wpfdatagrid


【解决方案1】:

我从MSDN documentation 中获取了一个示例,并对其进行了调整以在排序事件完成时引发排序事件。

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

这里是数据网格完成排序时触发的方法:

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

}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是一个非常简单且很棒的解决方案,效果很好,谢谢
    【解决方案3】:

    datagrid有“排序”事件,订阅吧!

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

    【讨论】:

    • 这不是正确的答案。 OP 明确表示他想要一个 Sorted 事件,而不是 Sorting 事件。区别在于项目是否已经排序。 Oliver Dufner 指向duplicate question 的评论是正确的回复。
    猜你喜欢
    • 2010-10-17
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多