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 не нажимается, нет стрелочки с направлением сортировки и тд. И пользователю визуально не понятно нажалась ли кнопка, есть сортировка нет или нет. Это конечно можно всё самому написать. Но почему-то мне кажется, что это тоже не правильный подход. Подскажите пожалуйста в каком направлении двигаться в моём случае?

  1. Синхронизировать как-то datagrid и ObservableCollection?

  2. Переопределять поведение нажатий, биндить к ним команды и сортировать исходную коллекцию?

    2.1 Как оставить нажатие на DataGridHeader и оставить стрелочку и при этом убрать встроенную в грид сортировку?

  3. Есть вариант проще?


Ответы (0 шт):