【问题标题】:Bind generic list to WPF datagrid and sort it将通用列表绑定到 WPF 数据网格并对其进行排序
【发布时间】:2017-11-01 00:08:47
【问题描述】:

关于this question 和答案,我已经调查过了,我知道使用以下行以编程方式在通用列表和数据网格之间进行绑定:

LibraryView.SetValue(DataGrid.ItemsSourceProperty, _manager.Library.Songs);

它可以工作,并且可以直观地排序(尽管列标题中没有箭头),但是就像答案中提到的那样,它隐式使用了 ICollectionView。现在我的问题是如何将排序反映到绑定的数据源,在我的例子中是通用列表。我已经找到了如何使用 winforms 执行此操作,但它比我预期的要复杂,我无法将其转换为 WPF。

提前致谢

【问题讨论】:

  • 为什么以及何时要对源集合进行排序,即_manager.Library.Songs?
  • 因为我将该数据源用作“播放列表”,所以顺序应该与视图相同,并且在单击列标题时像往常一样。
  • 此答案适用于 winforms,但我无法将其转换为 WPF(因为我是 WPF 新手):stackoverflow.com/a/2551416/5985593

标签: c# wpf sorting data-binding datagrid


【解决方案1】:

如果您希望视图对源集合进行排序,您可以将DataGridItemsSource 属性转换为您的集合类型并对这个集合类型进行排序。当然,这需要您知道如何对排序集合进行排序以及您正在处理的源集合类型。

如果_manager.Library.SongsList<T>,您可以例如使用List<T>.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
        }
    }
}

但一般来说,视图不应该对其绑定的源集合进行排序。

【讨论】:

    【解决方案2】:

    您可以自己创建ICollectionView 并将您的两个控件直接绑定到它,例如使用here 中的类ViewableCollection 并访问ViewableCollection.View 用于排序/过滤的集合。这样,您只需排序一次,并且更改会反映在所有控件中。 DataGrid 的默认排序行为也可以在没有额外代码的情况下工作,此外,您可以通过简单地在 ViewableCollection.View 上添加/清除当前 SortDescriptions 来从代码隐藏中排序。

    如果您选择使用此解决方案,请务必记住将 ItemsSource 属性绑定到 ViewableCollection.View 而不是集合本身。

    从表面上看,它的工作原理类似于从两个不同的控件直接绑定到 Forms 中的 DataViewDataTable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-22
      • 2016-01-20
      • 2011-01-31
      • 2017-05-14
      • 2023-02-06
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多