我有一个自定义实体,它包含FirstName,LastName属性(它还有其他属性)。我将此实体绑定到datagrid,它将FullName(LastName,FirstName)显示为DataGridTemplateColumn(使用带有StringFormat的MultiBinding)。允许用户对datagrid列进行排序,当他们单击FullName列时,记录必须按LastName排序,然后按FirstName排序(排序方向将根据点击次数切换)。我想知道在上面的场景中是否可以实现所需的排序(多列)?
我尝试使用SortMemberPath属性,但在那里我只能指定一列。
我知道如果我将一个名为FullName的自定义ReadOnly属性添加到我的实体中,那么事情会起作用,但我只是想了解是否可以通过MultiBinding实现相同的功能。
谢谢, 的Pankaj
答案 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