我有一个自定义实体,它包含FirstName, LastName属性(它也有其他属性)。我将这个实体绑定到一个数据网格,它将FullName (LastName, FirstName)显示为DataGridTemplateColumn(使用StringFormat的MultiBinding)。允许用户对数据网格列进行排序,当他们单击FullName列时,记录必须按LastName然后FirstName排序(排序方向将根据单击次数切换)。我想知道是否有可能在上述场景中实现所需的排序(多列)?
我尝试使用SortMemberPath属性,但我只能指定一列。
我知道如果我添加一个自定义的ReadOnly属性命名为FullName到我的实体的东西会起作用,但我只是想了解如果有可能实现相同的MultiBinding实现。
谢谢,Pankaj
我找到了另一个有帮助的线程。您可以使用DataGrid。事件来覆盖这里提到的默认排序。这个答案说他或她覆盖了DataGrid,但你不必这样做。它还假设您使用了illist作为数据源,因此这里有一个示例,相反,假设一个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