如何对DataGridTemplateColumn(使用MultiBinding)进行排序,其顺序与“多行”字段相同

时间:2011-09-12 10:00:24

标签: wpf sorting datagrid multibinding datagridtemplatecolumn

我有一个自定义实体,它包含FirstName,LastName属性(它还有其他属性)。我将此实体绑定到datagrid,它将FullName(LastName,FirstName)显示为DataGridTemplateColumn(使用带有StringFormat的MultiBinding)。允许用户对datagrid列进行排序,当他们单击FullName列时,记录必须按LastName排序,然后按FirstName排序(排序方向将根据点击次数切换)。我想知道在上面的场景中是否可以实现所需的排序(多列)?

我尝试使用SortMemberPath属性,但在那里我只能指定一列。

我知道如果我将一个名为FullName的自定义ReadOnly属性添加到我的实体中,那么事情会起作用,但我只是想了解是否可以通过MultiBinding实现相同的功能。

谢谢, 的Pankaj

1 个答案:

答案 0 :(得分:0)

我找到了另一个帮助过的线程。您可以使用DataGrid.Sorting事件覆盖提到的Here的默认排序。答案说他或她覆盖了DataGrid,但你不必这样做。它还假设您已使用IList作为数据源,因此这里是一个示例,它假设一个DataTable / DataView(IBindingList)源:

    private void dgPeople_Sorting(object sender, DataGridSortingEventArgs e)
    {
        //Assumes you've named your column colFullName in XAML
        if (e.Column == colFullName)
        {
            ListSortDirection direction = (e.Column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending;

            //set the sort order on the column
            e.Column.SortDirection = direction;

            //Prevent the default sorting
            e.Handled = true;

            //Get the static default view that the grid is bound to to redefine its sorting
            BindingListCollectionView cv = (BindingListCollectionView)CollectionViewSource.GetDefaultView(dgPeople.ItemsSource);
            cv.SortDescriptions.Clear();
            cv.SortDescriptions.Add(new SortDescription("FirstName", direction));
            cv.SortDescriptions.Add(new SortDescription("LastName", direction));
            cv.Refresh();
        }
    }

我发现你需要在ICollectionView(本例中为BindingListCollectionView)上执行排序,而不是DataView。如果不这样做,您在DataView上执行的排序将被ICollectionView上的排序集覆盖。

我发现此链接非常有用:http://msdn.microsoft.com/en-us/library/ms752347.aspx#what_are_collection_views