c# - 使用 CollectionViewSource 对 ColumnHeader 进行排序

标签 c# wpf datagrid collectionviewsource

我有一个 DataGrid,它是数据绑定(bind)到 Collection View 源的。 如果我将 DataGrid 绑定(bind)到 List,我可以通过单击列标题自动对 DataGrid 的列进行排序。

如果绑定(bind)到 CollectionViewSource,列标题仍会显示为 DataGrid 将排序的指示,但它不会排序。 我怎样才能实现相同的功能?

这是我的数据网格:

    <DataGrid Grid.Row="1" SelectedItem="{Binding SelectedItem}"
                  SelectionMode="Single" SelectionUnit="FullRow" AutoGenerateColumns="False" ItemsSource="{Binding CurrentErrorsViewSource.View}"
                  CanUserSortColumns="True" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" IsReadOnly="True">
            <DataGrid.Columns>
                <DataGridTemplateColumn CanUserResize="False">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ContentControl Template="{StaticResource ErrorRemoteControl}" Foreground="{StaticResource GlyphBrush}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTextColumn Header="{userInterface:Translation Description}" Binding="{Binding Path=(viewModels:ErrorItemViewModel.ErrorInformation).Description}" Width="Auto" />
                <DataGridTextColumn Header="{userInterface:Translation Code}" Binding="{Binding Path=(viewModels:ErrorItemViewModel.ErrorCode)}" Width="Auto" />
            </DataGrid.Columns>
      </DataGrid>

最佳答案

您可以处理 DataGrid 的 Sorting 事件,并在代码隐藏中创建适当的 SortDescription 对象并将它们添加到 CollectionViewSource 的 SortDescriptions 集合中。

void SortHandler(object sender, DataGridSortingEventArgs e)
{
    var collectionViewSource = (sender as DataGrid).ItemsSource as CollectionViewSource;

    var propertyName = e.Column.SortMemberPath;
    var sortDirection = ListSortDirection.Ascending;

    foreach (var sortDescription in collectionViewSource.SortDescriptions)
        if (sortDescription.PropertyName == propertyName &&
            sortDescription.Direction == ListSortDirection.Ascending)
        {
            sortDirection = ListSortDirection.Descending;
            break;
        }

    var sortDescription = new SortDescription()
    {
        PropertyName = propertyName,
        Direction = sortDirection
    };

    collectionViewSource.SortDescriptions.Clear();
    collectionViewSource.SortDescriptions.Add(sortDescription);
}

关于c# - 使用 CollectionViewSource 对 ColumnHeader 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30893109/

相关文章:

c# - 将 Crystal 报表对象传递给报表文档而不是物理文件

c# - 延迟加载 ListView 中的可见项

wpf - MVVM - WPF : Updating view model boolean property when TextBox is being edited

wpf - 需要相当于 SystemInformation.DragSize 的 Wpf

c# - WPF - DataGrid 仅显示基类的属性

c# - 如何删除行数据网格和更新 SQL 数据库 C#

c# - 在运行时将 DataTable 绑定(bind)到 WPF MVVM 中的 Datagrid

c# - 如何在 Windows 中以编程方式获取电源使用情况

c# - 将 Android 应用程序构建为统一的独立应用程序(用于在 PC 上使用),同时保持正确的宽高比

c# - 如何根据正则表达式将文本拆分为多行?