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 № 1The 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.