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

时间:2015-02-13 12:45:47

标签: c# silverlight sorting datagrid

在我的Silverlight应用程序中,我有一个显示项目列表的DataGrid。它与自定义ObservableCollection数据绑定,后者实现ICollectionView以提供SortDescription

当用户点击标题时,数据按此列按升序排序。大多数用户希望列"名称"按字母顺序排序(ASC),但对于"创建日期"首先显示最新条目(DESC)更有意义。

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

1 个答案:

答案 0 :(得分:0)

我在这里有两个选择,我可以看到。您可以使用针对相关网格的自定义排序函数扩展ObservableCollection。您可以看到如何执行此操作here

您的其他选项涉及使用标题中的超链接按钮自定义网格。然后,您可以捕获单击并以任何方式对基础集合进行排序。

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

为了简洁,我已经取消了你应该在点击处理程序中执行的所有空检查和其他操作。