2017-05-31 59 views
0

关于this question和答案,我看着它,我知道用下面这行做一个泛型列表和数据网格之间编程绑定:绑定泛型列表到WPF DataGrid和排序它

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

它工作,并可视化排序(虽然没有在箭头中的箭头),但正如答案中提到的,它隐式使用ICollectionView。现在我的问题是如何反映排序绑定的数据源,在我的情况下通用列表。我已经发现如何用winforms做到这一点,但它更复杂,然后我期望,我不能将其转换为WPF。

在此先感谢

+0

为什么以及何时要对来源集合进行排序,即_manager.Library.Songs? – mm8

+0

因为我使用该数据源作为“播放列表”,所以顺序应该与视图相同,并且像点击通常情况下那样点击柱状标头。 – JC97

+0

这个答案是为winforms,但我不能将其转换为WPF(因为我是新来的WPF):https://stackoverflow.com/a/2551416/5985593 – JC97

回答

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 
     } 
    } 
} 

但在一般的视图是不应该,它被绑定到源集合进行排序。

0

你可以自己创建ICollectionView和两个直接您的控件的使用类ViewableCollectionhere绑定到它,例如和排序/过滤收集访问ViewableCollection.View。这样你只能排序一次,所有的控制都会反映这些变化。 DataGrid的默认排序行为也可以在没有额外代码的情况下运行,您还可以通过简单地在ViewableCollection.View上添加/清除当前的SortDescriptions来排序代码隐藏。

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

在表面上,它的工作方式类似于直接绑定到DataTableDataView,其格式来自两个不同的控件。