我正在尝试对List<>进行排序绑定到WPF数据网格。在第一次加载时,它完全未排序,但是当您在标题上单击一次时,它应该在升序和降序之间切换。奇怪的是,List<>排序,当我重新绑定List<>到Itemssource,刷新等...它仍然显示升序。但是当我设置一个断点并去看看ItemsSource中的内容时,这些项目是排序的吗?!它无论出于何种原因都不会在数据网格中显示。关于如何发生这种情况的任何想法?
DataGrid的SortingEvent(LibraryView)
private void LibraryView_Sorting(object sender, DataGridSortingEventArgs e)
{
var sortDirection = e.Column.SortDirection;
switch (sortDirection)
{
default:
case ListSortDirection.Descending: //not needed, but makes things clearer
sortDirection = ListSortDirection.Ascending;
break;
case ListSortDirection.Ascending:
sortDirection = ListSortDirection.Descending;
break;
}
_manager.SortLibrary(e.Column.SortMemberPath, sortDirection);
//LibraryView.Items.Clear(); //tried this
LibraryView.ItemsSource = null; //tried this
LoadLibrary();
LibraryView.Items.Refresh(); //tried this
}
的LoadLibrary:
private void LoadLibrary()
{
if (_manager.CheckLibrary())
{
LibraryView.ItemsSource = _manager.GetLibrarySongs();
}
}
排序:
public void SortLibrary(string member, ListSortDirection? sortDirection)
{
PropertyDescriptor prop = TypeDescriptor.GetProperties(typeof(Song)).Find(member, true);
switch (sortDirection)
{
default:
case ListSortDirection.Descending: //not needed, but makes things clearer
_library.Songs = _library.Songs.OrderByDescending(s => prop.GetValue(s)).ToList();
Debug.WriteLine("Sorting descending!!!!");
break;
case ListSortDirection.Ascending:
_library.Songs = _library.Songs.OrderBy(s => prop.GetValue(s)).ToList();
Debug.WriteLine("Sorting ascencding!!!!");
break;
}
}
我知道这方面有很多话题,但我遇到的一切,仍然无法解决这个问题。 我对WPF没有太多经验,所以如果我做错了什么或做错了,请告诉我。 提前谢谢!
答案 0 :(得分:1)
通过这样做:
LibraryView.ItemsSource = _manager.GetLibrarySongs();
你破坏了DataBinding。 实际上你根本不应该进行排序。如果集合正确绑定到数据网格,它应该能够按开箱即用的列对条目进行排序。
答案 1 :(得分:1)
DataGrid
在您点击列标题时对List<T>
的视图进行排序,而您根本不需要任何操作。这是内置功能,因此您根本不必处理Sorting事件。只需将ItemsSource设置或绑定到List<T>
。
请注意,实际的源集合,即List<T>
没有排序。无论何时绑定到WPF中的某个集合,都会自动创建ICollectionView
,并且这个集合将按DataGrid
排序。