/ Odświeżanie datagrid / WPF po sortowaniu nie działa - c #, wpf, sortowanie, powiązanie danych, datagrid

WPF datagrid odświeżania po sortowania nie działa - c#, wpf, sortowania, wiązanie danych, datagrid

Próbuję posortować List <>, która jest powiązana zSiatka danych WPF. Przy pierwszym załadowaniu jest całkowicie nieposortowany, ale gdy klikniesz jeden raz nagłówek, powinien on przełączać się między rosnącym a malejącym. Dziwne jest to, że Lista <> sortuje, a kiedy ponownie wiążę List <> z Itemssource i odświeżanie itp. Nadal pokazuje kolejność rosnącą. Ale kiedy ustawiam punkt przerwania i sprawdzam, co jest w ItemsSource, elementy są sortowane ?! Po prostu nie wyświetla się w siatce danych z jakiegokolwiek powodu. Masz pojęcie, jak to się dzieje?

SortingEvent of DataGrid (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();
}
}

Sortowanie samo:

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

Wiem, że jest mnóstwo tematów na ten temat, alewszystko, z czym się spotkałem, nadal tego nie naprawia. Nie mam dużego doświadczenia z WPF, więc jeśli robię coś złego lub złej praktyki, daj mi znać. Z góry dziękuję!

Odpowiedzi:

1 dla odpowiedzi № 1

The DataGrid sortuje widok List<T> po kliknięciu nagłówków kolumn bez Ciebiew ogóle do niczego. Jest to wbudowana funkcjonalność, więc nie musisz w ogóle obsługiwać zdarzenia Sortowanie. Wystarczy ustawić lub powiązać element ItemsSource ze swoim List<T>.

Zauważ, że faktyczna kolekcja źródłowa, tj List<T> nie jest jednak posortowane. Ilekroć łączysz się z jakąś kolekcją w WPF, an ICollectionView jest tworzony automatycznie i to on jest sortowany według DataGrid.


1 dla odpowiedzi nr 2

Robiąc to:

LibraryView.ItemsSource = _manager.GetLibrarySongs();

niszczysz DataBinding. Właściwie nie powinieneś w ogóle przeprowadzać sortowania. Jeśli kolekcja jest poprawnie powiązana z siatką danych, powinna być w stanie posortować wpisy według kolumn po wyjęciu z pudełka.