WPF MVVM DataGrid сортировка и синхронизация с ObservableCollection
Есть кастомный аудиоплеер в котором порядка 20 различных столбцов. Данные отображаются на View c помощью DataGrid:
<DataGrid x:Name="DataGridView" ItemsSource="{Binding UnFilteredList}" SelectedItem="{Binding CurrentSelectedFile, Mode=TwoWay}"
AutoGenerateColumns="False" >
UnFilteredList - это ObservableCollection в который попадают экземпляры классы из фабрики.
private ObservableCollection<AbstractAudioFile> _unFilterdList;
public ObservableCollection<AbstractAudioFile> UnFilteredList
{
get { return _unFilterdList; }
set
{
//if (Equals(value, _unFilterdList)) return;
_unFilterdList = value;
//TableDataWrapper = CollectionViewSource.GetDefaultView(_unFilterdList);
OnPropertyChanged(nameof(UnFilteredList));
CurrentTotalAudioRecords = _unFilterdList.Count();
Debug.WriteLine("Collection change");
}
}
Воспроизведение работает по порядку который есть в UnFilteredList. После воспроизведения текущего файла вызывается:
public static T NextFile<T>(ObservableCollection<T> collecion,T currentItem)
{
var currentindex = collecion.IndexOf(currentItem);
if (currentindex < collecion.Count - 1)
{
return collecion[currentindex + 1];
}
return collecion[0];
}
Всё хорошо до момента пока пользователь не нажмёт на заголовок одного из столбцов в Datagrid. После этого получается, что коллекции хоть и одинаковые, но последовательность элементов разная. Выглядит это как будто плеер начал работать в режиме Shuffle.
Так как применяется паттерн MVVM я не могу узнать у datagrid следующий трек просто прибавив к индексу текущего +1. Приходиться оперировать коллекцией.
Пробовал применять решение отсюда: https://stackoverflow.com/a/46544413/8077755 Мало того, что в datagrid нет события sorted, а есть только sorting ещё и при этом начинает коряво работать сортировка в самом dataGrid. Получатся что исчезает стрелка направления сортировки, в сортировке перестаёт участвовать первая строка datagrid и сортировка всегда выполняется в одном направлении. То есть если выполнять сортировку по длительности треков в datagrid на первой позиции будет всегда строка с наименьшим временем воспроизведения и тд по всем столбца.
Согласно определению паттерна MVVM datagrid это только отображение данных. Значит нужно сортировать коллекцию которая с ним связанна. Получается нужно переопределить поведение нажатия на заголовок столбца. Но опять же если сделать так:
<Style TargetType="{x:Type DataGridColumnHeader}">
<EventSetter Event="Click" Handler="columnHeader_Click"/>
</Style>
В codeBehind:
private void columnHeader_Click(object sender, RoutedEventArgs e)
{
((MainWindowViewModel)DataContext).SortColumn.Execute(sender);
}
Во первых не очень-то вроде и по MVVMовски, нет? Во-вторых сортируем Observable коллекцию и при этом datagrid тоже сортируется. Выполняем двойную работу. Возможно сортировки будут не совпадут и пользователь опять получит Shuffle.
Можно отключить встроенную сортировку в xaml:
CanUserSortColumns="False"
Но тогда header не нажимается, нет стрелочки с направлением сортировки и тд. И пользователю визуально не понятно нажалась ли кнопка, есть сортировка нет или нет. Это конечно можно всё самому написать. Но почему-то мне кажется, что это тоже не правильный подход. Подскажите пожалуйста в каком направлении двигаться в моём случае?
Синхронизировать как-то datagrid и ObservableCollection?
Переопределять поведение нажатий, биндить к ним команды и сортировать исходную коллекцию?
2.1 Как оставить нажатие на DataGridHeader и оставить стрелочку и при этом убрать встроенную в грид сортировку?
Есть вариант проще?