Сортировка¶
Функция сортировки данных позволяет сортировать дочерние узлы одного уровня в контролах TreeList и TreeView по возрастанию или убыванию.
TreeList поддерживает сортировку данных по одному или нескольким колонкам. Контрол также позволяет пользователям сортировать данные щелчком мыши по заголовку колонки и с помощью контекстного меню заголовка колонки.
Действия конечного пользователя (TreeList)¶
В контроле TreeList пользователь может щёлкнуть левой кнопкой мыши по заголовку колонки, чтобы отсортировать эту колонку. Последующий щелчок по тому же заголовку колонки меняет направление сортировки на противоположное. Чтобы очистить сортировку, удерживайте клавишу CTRL и щёлкните по заголовку колонки.
Чтобы отсортировать данные по нескольким колонкам, пользователю необходимо удерживать клавишу SHIFT, а затем щёлкать по заголовкам колонок в нужном порядке. Контрол отсортирует данные по первому выбранной колонке, затем по второй колонке, и так далее.
Пользователь также может изменить параметры сортировки колонки из контекстного меню заголовка колонки. Щёлкните правой кнопкой мыши по заголовку колонки, чтобы вызвать это меню.
Используйте следующие свойства, чтобы запретить пользователю сортировать данные:
- Установите
TreeListControl.AllowSortingвfalse, чтобы запретить пользователю сортировку по любой колонке. - Установите
ColumnBase.AllowSortingвfalse, чтобы запретить пользователю сортировку по конкретной колонке.
Эти свойства не препятствуют сортировке данных в коде.
Контрол TreeView не имеет функций для сортировки данных из пользовательского интерфейса. Вы можете сортировать данные в коде для этого контрола.
Алфавитно-цифровая сортировка¶
Для колонок, отображающих текст в TreeListControl и TreeViewControl, вы можете использовать унаследованное свойство DataControlBase.TextSortMode, чтобы выбрать между алфавитной и алфавитно-цифровой сортировкой.
-
Сортировка
Alphabetical(по умолчанию): Этот режим сравнивает строки посимвольно. Если текст содержит числа, алгоритм сортировки обрабатывает их как отдельные символы, а не как числа. Например: -
Сортировка
Alphanumeric(естественный порядок): Этот режим подходит для строк, содержащих смесь текста и чисел. Алгоритм сортировки упорядочивает строки в понятном человеку, логическом порядке, обрабатывая числа как числовые значения, а не просто как символы. Например:Следующий код применяет алфавитно-цифровой порядок сортировки:
Свойство DataControlBase.TextSortMode влияет на сортировку всех колонок, отображающих текстовые значения.
На следующем изображении показаны дополнительные примеры, сравнивающие алфавитный и алфавитно-цифровой режимы сортировки:
Сортировка в коде (TreeList)¶
Вы можете сортировать данные TreeList по одному или нескольким колонкам. Когда вы сортируете данные по нескольким колонкам, контрол TreeList переупорядочивает узлы согласно значениям первой колонки сортировки. Затем он переупорядочивает отсортированные узлы по второй колонке сортировки, сохраняя порядок значений в первой колонке, и так далее.
Используйте следующие свойства, чтобы отсортировать данные по колонке:
-
Установите свойство
ColumnBase.SortDirectionвAscendingилиDescending. Это свойство задаёт порядок сортировки данных колонки. -
Установите свойство
ColumnBase.SortIndexв неотрицательное значение, чтобы отсортировать данные по колонке в порядке возрастания. СвойствоColumnBase.SortIndexзадаёт позицию колонки среди отсортированных колонок.
Выполните одно из следующих действий, чтобы очистить сортировку:
- Установите свойство
SortDirectionколонки вnull, чтобы очистить сортировку для этой колонки. - Вызовите унаследованный метод
DataControlBase.ClearSortingконтрола, чтобы удалить сортировку, применённую ко всем колонкам.
Следующий код очищает сортировку, а затем сортирует данные по двум колонкам:
using CommunityToolkit.Mvvm.ComponentModel;
using System.ComponentModel;
treeList.ClearSorting();
treeListColumn1.SortDirection = ListSortDirection.Ascending;
treeListColumn3.SortDirection = ListSortDirection.Descending;
Вы можете обернуть свой код методами BeginDataUpdate и EndDataUpdate, чтобы предотвратить избыточные обновления при изменении нескольких параметров контрола (включая параметры сортировки).
using CommunityToolkit.Mvvm.ComponentModel;
using System.ComponentModel;
treeList.BeginDataUpdate();
treeList.ClearSorting();
treeListColumn1.SortIndex = 0;
treeListColumn3.SortIndex = 1;
treeListColumn2.SortDirection = ListSortDirection.Descending;
treeList.EndDataUpdate();
Сортировка в коде (TreeView)¶
Чтобы отсортировать данные в TreeView, используйте свойство SortDirection вашего объекта TreeViewControl. Установите это свойство в Ascending или Descending, чтобы отсортировать данные в нужном порядке.
Выполните одно из следующих действий, чтобы очистить сортировку:
- Установите свойство
SortDirectionвnull. - Вызовите унаследованный метод
DataControlBase.ClearSortingконтрола.
Сортируемые колонки и режим сортировки (TreeList и TreeView)¶
Контролы TreeList и TreeView могут сортировать колонки по значениям редактирования, отображаемым значениям, либо согласно пользовательскому алгоритму сортировки. Режим сортировки по умолчанию зависит от встроенного редактора колонки и типа данных привязанного свойства:
- Сортировка по значениям редактирования — Все колонки, кроме колонок со встроенным ComboBoxEditor.
- Сортировка по отображаемому тексту — Колонки со встроенным ComboBoxEditor.
- Без сортировки — Колонки, привязанные к объектам, не реализующим интерфейс
IComparable. Например, типы данных изображений не реализуют этот интерфейс, поэтому для соответствующих колонок по умолчанию сортировка недоступна. См. раздел Пользовательская сортировка ниже, чтобы узнать, как принудительно отсортировать такие колонки.
Свойство ColumnBase.SortMode (в TreeList) и свойство TreeViewControl.SortMode (в TreeView) позволяют изменить режим сортировки по умолчанию. Доступны следующие варианты:
SortMode.Value— Сортировка по значениям редактирования ячеек.SortMode.DisplayText— Сортировка по отображаемому тексту ячеек.SortMode.Custom— Пользовательская сортировка. Установите свойствоSortModeвCustom, а затем обработайте событиеTreeListControl.CustomColumnSort/TreeViewControl.CustomSort, чтобы реализовать пользовательскую логику сортировки. См. Пользовательская сортировка.
Пользовательская сортировка¶
Событие CustomColumnSort/CustomSort позволяет реализовать пользовательскую логику сортировки. Установите свойство ColumnBase.SortMode (в TreeList) и свойство TreeViewControl.SortMode (в TreeView) в Custom, чтобы включить это событие.
Если тип данных, привязанный к колонке, не реализует интерфейс IComparable (например, тип данных изображения), контрол TreeList/TreeView по умолчанию запрещает сортировку для этой колонки. Однако вы можете включить сортировку для этой колонки следующим образом:
- TreeList: Установите свойство колонки
AllowSortingвtrue(значение по умолчанию для этого свойства —null). - TreeList и TreeView: Установите свойство
SortModeвCustom. - TreeList и TreeView: Обработайте событие
CustomColumnSort/CustomSort, чтобы реализовать пользовательскую сортировку.
При обработке события CustomColumnSort/CustomSort вам следует сравнить два узла, указанных в параметрах события. Присвойте результат сравнения параметру события Result следующим образом:
-
Установите
Resultв-1, если первый узел должен отображаться выше второго узла при сортировке данных по возрастанию. -
Установите
Resultв1, если первый узел должен отображаться ниже второго узла при сортировке данных по возрастанию. -
Установите
Resultв0, если оба узла равны.
Следующий пример обрабатывает событие TreeListControl.CustomColumnSort, чтобы отсортировать данные в колонке "FileName" пользовательским способом. Колонка "FileName" хранит имена файлов в стандартном формате "filename.ext". Пользовательская процедура сортировки сортирует имена файлов по их расширениям.
<mxtl:TreeListControl Name="treeList" CustomColumnSort="TreeList_CustomColumnSort">
<mxtl:TreeListControl.Columns>
<mxtl:TreeListColumn Width="*" FieldName="FileName" SortMode="Custom" />
</mxtl:TreeListControl.Columns>
</mxtl:TreeListControl>
private void TreeList_CustomColumnSort(object? sender, TreeListCustomColumnSortEventArgs e)
{
if (e.Column.FieldName == "FileName")
{
string fileName1 = Convert.ToString(e.Value1);
string fileName2 = Convert.ToString(e.Value2);
string newfileName1 = extractFileExtension(fileName1) + "." + fileName1;
string newfileName2 = extractFileExtension(fileName2) + "." + fileName2;
e.Result = String.Compare(newfileName1, newfileName2);
}
}
string extractFileExtension(string fileName)
{
string res = "";
int dotIndex = fileName.LastIndexOf('.');
if (dotIndex > 0)
res = fileName.Substring(dotIndex + 1);
return res;
}
Реакция на сортировку данных¶
Обработайте следующие события, чтобы выполнить пользовательские действия при сортировке данных:
DataControlBase.StartSorting— Возникает, когда данные вот-вот будут отсортированы.DataControlBase.EndSorting— Возникает по завершении сортировки данных.
Дополнительный API¶
TreeListControlBase.AutoScrollOnSorting— Задаёт, прокручивает ли контрол автоматически видовое окно, чтобы сделать сфокусированный узел видимым, когда данные отсортированы.
* Эта страница переведена с использованием технологий машинного перевода.


