Silverlight DataGrid 中列的不同默认排序顺序

Different default sorting order for columns in Silverlight DataGrid

在我的 Silverlight 应用程序中,我有一个显示项目列表的 DataGrid。它是 data-bound 到实现 ICollectionView 以提供 SortDescription 的自定义 ObservableCollection

当用户点击header时,数据按此列升序排列。大多数用户期望列 "Name" 按字母顺序排序 (ASC),但对于 "Creation Date",首先显示最新条目 (DESC) 更有意义。

是否可以覆盖 一些 列的默认排序顺序?

这里有两个选项,我可以看到。您可以使用相关网格的自定义排序函数扩展 ObservableCollection。你可以看到如何做到这一点 here.

您的另一个选择涉及使用 header 中的超链接按钮自定义网格。然后,您可以捕获点击并对基础 collection 进行任何您想要的排序。

UI 代码

<my:DataGrid.Columns>
    <my:DataGridTextColumn DisplayMemberBinding="{Binding Name}">
        <my:DataGridTextColumn.Header>
            <HyperlinkButton Content="Name" Tag="Name"
                Click="Sort_Click" TextDecorations="Underline"/>
        </my:DataGridTextColumn.Header>
    </my:DataGridTextColumn>
    <my:DataGridTextColumn DisplayMemberBinding="{Binding CreationDate}">
        <my:DataGridTextColumn.Header>
            <HyperlinkButton Content="CreationDate" Tag="CreationDate"
                Click="Sort_Click" TextDecorations="Underline"/>
        </my:DataGridTextColumn.Header>
    </my:DataGridTextColumn>
</my:DataGrid.Columns>

点击处理程序

private void Sort_Click(object sender, RoutedEventArgs e)
{
    HyperlinkButton button = sender as HyperlinkButton;
    //  Which property are we sorting?
    string sortProperty = button.Tag.ToString();
    //  sort direction (variable to keep track of which way were sorting last, add key checking an null checking)
    bool sortAsc = !this.columnSortState[sortProperty];
    IEnumerable<ITEMS> dataItems = dataGrid.ItemsSource as IEnumerable<ITEMS>;
    switch (sortProperty)
    {
        case "Name":
            dataItems = sortAsc
                ? dataItems.OrderBy(x => x.Name)
                : dataItems.OrderByDescending(x => x.Name);
            break;
        case "CreationDate":
            dataItems = sortAsc
                ? dataItems.OrderByDescending(x => x.CreationDate);
                : dataItems.OrderBy(x => x.CreationDate)
            break;
    }

    this.columnSortState[sortProperty] = isSortAsc;
}

为了简洁起见,我已经去掉了所有的空值检查和你应该在点击处理程序中做的其他事情。