Datagrid:没有Sorted事件吗?

Hou*_*man 7 wpf wpfdatagrid

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

我也调查过CollectionView,ListCollectionView那就是将对象暴露给View,没有任何运气.

我很惊讶,因为这应该是开箱即用的.有任何想法吗?

Car*_*rol 5

我从MSDN 文档中获取了一个示例,并对其进行了调整,以在 Sorting 事件完成时引发 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以在代码隐藏中使用它。

datagrid.Sorted += new RoutedEventHandler(datagrid_Sorted);
Run Code Online (Sandbox Code Playgroud)

或在 XAML 中

<local:CustomDataGrid x:Name="datagrid" Sorted="datagrid_Sorted"/>
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)


pha*_*tar 5

您仍然可以订阅 DataGrid 排序事件:

<local:CustomDataGrid x:Name="datagrid" Sorting="datagrid_Sorted;"/>
Run Code Online (Sandbox Code Playgroud)

但为了确保您的操作在排序完成后发生,请使用 Dispatcher :

private void DataGrid_Sorting(object sender, DataGridSortingEventArgs e)
{

    this.Dispatcher.BeginInvoke((Action)delegate()
    {
        //runs after sorting is done
    }, null);
}
Run Code Online (Sandbox Code Playgroud)

这样,就不需要自定义 Datagrid 类。


den*_*zov 2

datagrid 有“排序”活动,订阅它!

XAML:

<DataGrid ItemsSource="{Binding YourItems}" AutoGenerateColumns="True" anUserSortColumns="True" 
           Sorting="DataGrid_Sorting"/>
Run Code Online (Sandbox Code Playgroud)

.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));
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是正确的答案。OP 特别说他想要一个排序事件,而不是排序事件。区别在于项目是否已经排序。奥利弗·杜夫纳的评论指向[重复问题](http://stackoverflow.com/questions/8416961/how-can-i-be-notified-if-a-datagrid-column-is-sorted-and-not-sorting )是正确的反应。 (14认同)