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

C# Silverlight DataGrid中列的不同默认排序顺序,c#,silverlight,sorting,datagrid,C#,Silverlight,Sorting,Datagrid,在我的Silverlight应用程序中,我有一个显示项目列表的DataGrid。它是绑定到自定义ObservableCollection的数据,该自定义ObservableCollection实现了ICollectionView,以提供排序描述 当用户单击标题时,数据按此列升序排序。大多数用户希望“Name”列按字母顺序排序(ASC),但对于“Creation Date”,首先显示最新条目(DESC)更有意义 是否可以覆盖部分列的默认排序顺序?我可以看到这里有两个选项。您可以使用有关网格的自定义

在我的Silverlight应用程序中,我有一个显示项目列表的
DataGrid
。它是绑定到自定义
ObservableCollection
的数据,该自定义
ObservableCollection实现了
ICollectionView
,以提供
排序描述

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


是否可以覆盖部分列的默认排序顺序?

我可以看到这里有两个选项。您可以使用有关网格的自定义排序函数扩展ObservableCollection。你可以看看怎么做

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

用户界面代码

<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;
}
private void Sort\u单击(对象发送方,路由目标)
{
HyperlinkButton button=发送方为HyperlinkButton;
//我们要分类哪些属性?
string sortProperty=button.Tag.ToString();
//排序方向(用于跟踪最后排序的方式的变量,添加键检查和空检查)
bool sortAsc=!this.columnSortState[sortProperty];
IEnumerable dataItems=dataGrid.ItemsSource作为IEnumerable;
开关(sortProperty)
{
案例“名称”:
dataItems=sortAsc
?dataItems.OrderBy(x=>x.Name)
:dataItems.OrderByDescending(x=>x.Name);
打破
案例“CreationDate”:
dataItems=sortAsc
?dataItems.OrderByDescending(x=>x.CreationDate);
:dataItems.OrderBy(x=>x.CreationDate)
打破
}
this.columnSortState[sortProperty]=isSortAsc;
}

为了简洁起见,我已经删除了所有空值检查和您应该在单击处理程序中执行的其他操作。

@Iceat,那里的解决方案不适用:
DataGrid
for Silverlight没有
排序事件。哦,您说得对。我的错,谢谢你的回答。我必须实现自己的
可观察收集
,但最终它成功了。