C# 将泛型列表绑定到WPF datagrid并对其排序
关于和答案,我已经研究过了,我知道可以使用下面这行代码在泛型列表和datagrid之间进行编程绑定:C# 将泛型列表绑定到WPF datagrid并对其排序,c#,wpf,sorting,data-binding,datagrid,C#,Wpf,Sorting,Data Binding,Datagrid,关于和答案,我已经研究过了,我知道可以使用下面这行代码在泛型列表和datagrid之间进行编程绑定: LibraryView.SetValue(DataGrid.ItemsSourceProperty, _manager.Library.Songs); 它可以工作,并且可以直观地进行排序(虽然列标题中没有箭头),但是正如答案中提到的,它隐式地使用了ICollectionView。现在我的问题是如何将排序反映到绑定的数据源,在我的例子中是泛型列表。我已经找到了如何使用winforms实现它,但它
LibraryView.SetValue(DataGrid.ItemsSourceProperty, _manager.Library.Songs);
它可以工作,并且可以直观地进行排序(虽然列标题中没有箭头),但是正如答案中提到的,它隐式地使用了ICollectionView。现在我的问题是如何将排序反映到绑定的数据源,在我的例子中是泛型列表。我已经找到了如何使用winforms实现它,但它比我预期的要复杂得多,我无法将其转换为WPF
提前感谢您可以自己创建
ICollectionView
并直接将两个控件绑定到它,例如使用类ViewableCollection
,并访问排序/筛选集合的ViewableCollection.View
。这样,您将只进行一次排序,并且更改将反映在所有控件中。DataGrid
的默认排序行为也将在没有额外代码的情况下工作,另外,您可以通过在ViewableCollection.View上添加/清除当前SortDescriptions
从codebehind进行排序
如果选择使用此解决方案,请务必记住将ItemsSource
属性绑定到ViewableCollection.View
而不是集合本身
从表面上看,它的工作原理类似于以两个不同控件的形式直接绑定到DataTable
的DataView
。如果希望视图对源集合进行排序,可以将DataGrid
的ItemsSource属性强制转换为您的集合类型并对其进行排序。当然,这需要您知道如何对排序集合进行排序,以及您正在处理的源集合的类型
如果\u manager.Library.Songs
是一个列表
,您可以使用List.Sort
方法对其进行排序:
private void dg_Sorting(object sender, DataGridSortingEventArgs e)
{
var sourceCollection = dg.ItemsSource as List<Item>;
if (sourceCollection != null)
{
var sortDirection = e.Column.SortDirection;
switch (sortDirection)
{
default:
case ListSortDirection.Descending:
sortDirection = ListSortDirection.Ascending;
break;
case ListSortDirection.Ascending:
sortDirection = ListSortDirection.Descending;
break;
}
int direction = (sortDirection == ListSortDirection.Ascending ? 1 : -1);
string property = e.Column.SortMemberPath;
switch (property)
{
case nameof(Item.X):
sourceCollection.Sort((x, y) => x.X.CompareTo(y.X) * direction);
break;
//...and so on for all properties/columns
}
}
}
private void dg_排序(对象发送方、DataGridSortingEventArgs e)
{
var sourceCollection=dg.ItemsSource as List;
if(sourceCollection!=null)
{
var sortDirection=e.Column.sortDirection;
开关(排序方向)
{
违约:
案例列表排序方向。降序:
sortDirection=列表sortDirection.升序;
打破
案例列表排序方向。升序:
sortDirection=ListSortDirection.Descending;
打破
}
int direction=(sortDirection==ListSortDirection.Ascending?1:-1);
字符串属性=e.Column.SortMemberPath;
交换机(属性)
{
案例名称(项目X):
sourceCollection.Sort((x,y)=>x.x.CompareTo(y.x)*方向);
打破
//…依此类推,适用于所有属性/列
}
}
}
但通常情况下,视图不应对其绑定的源集合进行排序。为什么以及何时要对源集合(即_manager.Library.Songs)进行排序?因为我将该数据源用作“播放列表”,因此,顺序应该与视图相同,当您像往常一样单击columnheader时。这个答案适用于winforms,但我无法将其转换为WPF(因为我是WPF新手):