排序不起作用后WPF数据网格刷新

时间:2017-05-26 09:37:20

标签: c# wpf sorting data-binding datagrid

我正在尝试对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没有太多经验,所以如果我做错了什么或做错了,请告诉我。 提前谢谢!

2 个答案:

答案 0 :(得分:1)

通过这样做:

LibraryView.ItemsSource = _manager.GetLibrarySongs();

你破坏了DataBinding。 实际上你根本不应该进行排序。如果集合正确绑定到数据网格,它应该能够按开箱即用的列对条目进行排序。

答案 1 :(得分:1)

DataGrid在您点击列标题时对List<T>的视图进行排序,而您根本不需要任何操作。这是内置功能,因此您根本不必处理Sorting事件。只需将ItemsSource设置或绑定到List<T>

请注意,实际的源集合,即List<T>没有排序。无论何时绑定到WPF中的某个集合,都会自动创建ICollectionView,并且这个集合将按DataGrid排序。