Перейти к содержанию

Сортировка

Функция сортировки данных позволяет сортировать дочерние узлы одного уровня в контролах TreeList и TreeView по возрастанию или убыванию.

TreeList поддерживает сортировку данных по одному или нескольким колонкам. Контрол также позволяет пользователям сортировать данные щелчком мыши по заголовку колонки и с помощью контекстного меню заголовка колонки.

Действия конечного пользователя (TreeList)

В контроле TreeList пользователь может щёлкнуть левой кнопкой мыши по заголовку колонки, чтобы отсортировать эту колонку. Последующий щелчок по тому же заголовку колонки меняет направление сортировки на противоположное. Чтобы очистить сортировку, удерживайте клавишу CTRL и щёлкните по заголовку колонки.

Чтобы отсортировать данные по нескольким колонкам, пользователю необходимо удерживать клавишу SHIFT, а затем щёлкать по заголовкам колонок в нужном порядке. Контрол отсортирует данные по первому выбранной колонке, затем по второй колонке, и так далее.

Пользователь также может изменить параметры сортировки колонки из контекстного меню заголовка колонки. Щёлкните правой кнопкой мыши по заголовку колонки, чтобы вызвать это меню.

Используйте следующие свойства, чтобы запретить пользователю сортировать данные:

  • Установите TreeListControl.AllowSorting в false, чтобы запретить пользователю сортировку по любой колонке.
  • Установите ColumnBase.AllowSorting в false, чтобы запретить пользователю сортировку по конкретной колонке.

Эти свойства не препятствуют сортировке данных в коде.

Контрол TreeView не имеет функций для сортировки данных из пользовательского интерфейса. Вы можете сортировать данные в коде для этого контрола.

Алфавитно-цифровая сортировка

Для колонок, отображающих текст в TreeListControl и TreeViewControl, вы можете использовать унаследованное свойство DataControlBase.TextSortMode, чтобы выбрать между алфавитной и алфавитно-цифровой сортировкой.

  • Сортировка Alphabetical (по умолчанию): Этот режим сравнивает строки посимвольно. Если текст содержит числа, алгоритм сортировки обрабатывает их как отдельные символы, а не как числа. Например:

    sorting-alphabetical-example1

  • Сортировка Alphanumeric (естественный порядок): Этот режим подходит для строк, содержащих смесь текста и чисел. Алгоритм сортировки упорядочивает строки в понятном человеку, логическом порядке, обрабатывая числа как числовые значения, а не просто как символы. Например:

    sorting-alphanumeric-example1

    Следующий код применяет алфавитно-цифровой порядок сортировки:

    <mxtl:TreeListControl Name="treeList1" ItemsSource="{Binding MyData}" ChildrenSelector="{StaticResource childrenSelector}" 
                        TextSortMode="Alphanumeric"
                        />
    

Свойство DataControlBase.TextSortMode влияет на сортировку всех колонок, отображающих текстовые значения.

На следующем изображении показаны дополнительные примеры, сравнивающие алфавитный и алфавитно-цифровой режимы сортировки:

 sorting-textsortmode-example2

Сортировка в коде (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, чтобы отсортировать данные в нужном порядке.

treeViewControl1.SortDirection = ListSortDirection.Ascending;

Выполните одно из следующих действий, чтобы очистить сортировку:

  • Установите свойство 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 — Задаёт, прокручивает ли контрол автоматически видовое окно, чтобы сделать сфокусированный узел видимым, когда данные отсортированы.



* Эта страница переведена с использованием технологий машинного перевода.