【问题标题】:DataGrid sorting ascending > descending > null (no sort)DataGrid 排序升序 > 降序 > null(无排序)
【发布时间】:2013-04-24 07:30:19
【问题描述】:

我试图找到一种方法来配置 wpf DataGrid 以循环排序: 重复点击时{升序、降序、无排序}。

我写了这个(但不喜欢它,因此这个 q):

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding DayOfWeek}" >
            <DataGridTextColumn.Header>
                <DataGridColumnHeader PreviewMouseLeftButtonDown="DataGridColumnHeaderClick">Day</DataGridColumnHeader>
            </DataGridTextColumn.Header>
        </DataGridTextColumn>
    </DataGrid.Columns>
    <sys:DateTime>1/2/3</sys:DateTime>
    <sys:DateTime>1/2/4</sys:DateTime>
    <sys:DateTime>1/2/5</sys:DateTime>
</DataGrid>
private void DataGridColumnHeaderClick(object sender, RoutedEventArgs e)
{
    var header = (DataGridColumnHeader) sender;
    if (header.SortDirection == ListSortDirection.Descending)
    {
        header.Column.SortDirection = null;
        e.Handled = true;
    }
}

有没有办法配置 DataGrid 以在不破解事件处理程序的情况下执行此操作?

【问题讨论】:

    标签: wpf sorting datagrid


    【解决方案1】:

    尝试了here 建议的解决方案,如下所示:

    <DataGrid AutoGenerateColumns="False" Sorting="DataGridSorting">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Day" Binding="{Binding DayOfWeek}" />
            <DataGridTextColumn Header="Date" Binding="{Binding Date}" />
        </DataGrid.Columns>
        <sys:DateTime>1/1/1</sys:DateTime>
        <sys:DateTime>1/2/1</sys:DateTime>
        <sys:DateTime>1/3/1</sys:DateTime>
    </DataGrid>
    
    private void DataGridSorting(object sender, DataGridSortingEventArgs e)
    {
        DataGrid dataGrid =(DataGrid) sender;
        string sortPropertyName = e.Column.SortMemberPath;
        if (!string.IsNullOrEmpty(sortPropertyName))
        {
            // sorting is cleared when the previous state is Descending
            if (e.Column.SortDirection.HasValue && e.Column.SortDirection.Value == ListSortDirection.Descending)
            {
                e.Column.SortDirection = null;
                if ((Keyboard.Modifiers & ModifierKeys.Shift) != ModifierKeys.Shift)
                {
                    foreach (var sd in dataGrid.Items.SortDescriptions
                        .Where(sd => sd.PropertyName == sortPropertyName).ToList())
                    {
                        dataGrid.Items.SortDescriptions.Remove(sd);
                    }
                }
                else
                {
                    dataGrid.Items.SortDescriptions.Clear();
                }
                dataGrid.Items.Refresh();
                e.Handled = true;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 2023-03-07
      • 2012-12-21
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 2015-03-09
      相关资源
      最近更新 更多