Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将泛型列表绑定到WPF datagrid并对其排序_C#_Wpf_Sorting_Data Binding_Datagrid - Fatal编程技术网

C# 将泛型列表绑定到WPF 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实现它,但它

关于和答案,我已经研究过了,我知道可以使用下面这行代码在泛型列表和datagrid之间进行编程绑定:

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新手):