C# MVVM WPF DataGrid Пользовательская сортировка по двум колонкам
Есть приложение которое обрабатывает файлы, а затем помещает результаты в DataGrid. Количество колонок >10. Приложение построено с использованием шаблона MVVM.
<DataGrid x:Name="DataGridView" ItemsSource="{Binding DatagridICollectionView}" SelectedItem="{Binding CurrentSelectedFile, Mode=TwoWay}"
AutoGenerateColumns="False" SelectionChanged="SelectionChanged" IsSynchronizedWithCurrentItem="True" IsReadOnly="True" Margin="3">
....
Колонки:
<DataGrid.Columns>
<DataGridTextColumn Header="File Name" Binding="{Binding fileName }" DisplayIndex="{Binding Data.FileNameColumnPosition, Source={StaticResource ProxyElement}, Mode=TwoWay,FallbackValue=0}"/>
<DataGridTextColumn Header="File Type" Binding="{Binding fileType}" Visibility="{Binding Data.FileTypeVisible, Source={StaticResource ProxyElement}, Converter={StaticResource VisibilityConv}}" DisplayIndex="{Binding Data.FileTypeColumnPosition, Source={StaticResource ProxyElement}, Mode=TwoWay, FallbackValue=1}"/>
<DataGridTextColumn Header="Date and Time" Binding="{Binding FileDateTime}" Visibility="{Binding Data.DateAndTimeVisibility, Source={StaticResource ProxyElement}, Converter={StaticResource VisibilityConv}}" DisplayIndex="{Binding Data.DateAndTimeColumnPosition, Source={StaticResource ProxyElement}, Mode=TwoWay, FallbackValue=2}"/>
...
В datagrid разрешена сортировка в столбцах.
Появилась задача выполнять вторичную сортировку по полю дата создания файла после выполнения базовой сортировки по какому-нибудь из столбцов. Сейчас если выполнить сортировку по какому-нибудь из столбцов, то мы получаем следующую картину:
Здесь выполнена сортировка по второму столбцу, но в первом столбце даты создания размещаются рандомно. Необходимо чтобы при сортировке по любому из столбцов происходила вторичная сортировка по дате создания файла. В какую сторону копать для решения этой задачи? При этом желательно оставаться в рамках MVVM
Дополнение: На данный момент сортировка реализована во View. Работает нажатием на заголовок столбца.
Ответы (1 шт):
Свойство SortDirection призвано фактически устанавливать визуальную стрелку сортировки. Внутренне функция сортировки отслеживает нажатие кнопки мыши по header столбца. Клик, вроде, вызывает определённые функции, которые учитывают свойство DataGrid.Items.SortDirections. По сути, вообще все эти функции реализованы в свойстве Items, которое является обёрткой над списком. (PS: подобная привязка используется для примера)
Способ 1. Простой. Надёжный. Лучший.
На View-части оформляем таблицу с подобным набором свойств:
<DataGrid x:Name="tbl" AutoGenerateColumns="False"
CanUserSortColumns="True">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Date_f}"
SortDirection="Descending"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Name}"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Charact}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
Делаем отсортированную выборку перед привязкой
tbl.ItemsSource = new GAREntities().Table_1.ToList().OrderByDescending(x=>x.Date_f);
После запуска увидим такую картину:
Способ 2. Программно настраиваем DataGrid
Для этого необходимо оставить предыдущую разметку, а в коде описать следующие действия:
tbl.ItemsSource = new GAREntities().Table_1.ToList();
tbl.Items.SortDescriptions.Add(new System.ComponentModel.SortDescription()
{ PropertyName="Date_f", Direction= System.ComponentModel.ListSortDirection.Descending});
Итог будет аналогичный 1-му способу.
Способ 3. Всё в разметке
Оставим разметку DataGrid как в способе 1 и объявим ресурс CollectionViewSource со следующим содержимым:
<Grid.Resources>
<CollectionViewSource x:Name="cvs" x:Key="lst" Source="{Binding}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Date_f" Direction="Descending"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Grid.Resources>
В свойстве Source задаётся привязка к нужному списку. После этого необходимо отредактировать DataGrid и добавить свойство ItemsSource:
<DataGrid x:Name="tbl" AutoGenerateColumns="False"
CanUserSortColumns="True" ItemsSource="{Binding Source={StaticResource lst}}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Date_f}"
SortDirection="Descending"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Name}"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Charact}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
Результат аналогичен.
НО... стоит ли оно того, если есть 1-й способ? Зачем нужно лезть в системные операции, если есть более прозрачный способ?

