Table of Contents

Узлы

Класс TreeListNode инкапсулирует узел в контролах TreeList и TreeView. Узел TreeView отображает одно значение, в то время как узел TreeList может отображать несколько значений (по значению для каждого столбца).

Создание узлов и доступ к ним

В режиме привязки контролы TreeList и TreeView автоматически создают узлы для всех элементов источника данных. Вы можете получить доступ к созданным узлам, используя следующие свойства:

  • TreeListControlBase.Nodes — Корневые узлы.
  • TreeListNode.Nodes — Дочерние узлы узла.

Вам нужно создавать узлы вручную, когда контрол находится в Режим без привязки к данным .

Смотрите также: Поиск узлов .

Получение и установка значений узлов

Свойство TreeListNode.Content определяет нижележащий объект данных узла. Вы можете ввести значение этого свойства в свой бизнес-объект, а затем прочитать отдельные значения. В Режим без привязки к данным вы можете вручную назначить объект свойству TreeListNode.Content. Не назначайте объекты TreeListNode.Content в режиме привязки.

Чтобы получить и задать значения отдельных ячеек, вы можете использовать следующие методы:

  • GetCellValue и GetCellDisplayText
  • SetCellValue

Сфокусированный узел

Используйте свойство TreeListControlBase.FocusedNode для доступа к текущему сфокусированному узлу (узлу, который получает события клавиатуры). Чтобы получить объект данных (бизнес) сфокусированного узла, используйте унаследованное свойство DataControlBase.FocusedItem.

Событие TreeListControlBase.FocusedNodeChanged позволяет вам реагировать на перемещение фокуса между узлами.

Смотрите также: Выбор нескольких узлов (выделение) .

Картинки для узлов

Контролы TreeList и TreeView поддерживают картинки узлов. Эти картинки отображаются перед значениями ячеек в столбце иерархии (первый столбец, по умолчанию).

Установите для свойства TreeListControlBase.ShowNodeImages значение true, чтобы включить картинки узлов.

Следующие подходы позволяют вам предоставлять картинки узлов:

  • Используйте свойство TreeListControlBase.NodeImageFieldName, чтобы указать свойство (поле) бизнес-объекта, которое возвращает картинку узла (объект IImage).

  • Используйте свойство TreeListControlBase.NodeImageSelector, чтобы указать селектор (объект ITreeListNodeImageSelector), который возвращает картинки узлов для определенных узлов.

  • В несвязанном режиме вы можете задать картинку узла, используя свойство TreeListNode.Image.

Пример

Следующий код отображает картинки для узлов, которые имеют определенное значение ячейки.

В примере создается объект NodeImageSelector, который возвращает картинки в соответствии со свойством OnVacation бизнес-объекта.

xmlns:mxtl="clr-namespace:Eremex.AvaloniaUI.Controls.TreeList;assembly=Eremex.Avalonia.Controls"

<Grid.Resources>
    <local:MyNodeImageSelector x:Key="myNodeImageSelector" />
    ...
</Grid.Resources>

<mxtl:TreeListControl 
    Grid.Column="0" Grid.Row="1" Name="treeList2"
    ChildrenSelector="{StaticResource mySelector}"
    ItemsSource="{Binding Employees}"
    NodeImageSelector="{StaticResource myNodeImageSelector}"
    ShowNodeImages="True"
    >
...
</mxtl:TreeListControl>
using Avalonia.Media.Imaging;
using Avalonia.Platform;

public class MyNodeImageSelector : ITreeListNodeImageSelector
{
    IImage onVacationImage;
    IImage defaultImage;

    public MyNodeImageSelector()
    {
        onVacationImage = new Bitmap(AssetLoader.Open(new Uri("avares://AvaloniaApp1/Assets/plane.png")));
        defaultImage = null;
    }
    public IImage SelectImage(TreeListNode node)
    {
        Employee row = node.Content as Employee;
        return row.OnVacation? onVacationImage: defaultImage;
    }
}

Встроенные флажки

Свойство ShowNodeCheckBoxes включает встроенные флажки для узлов. Они позволяют пользователю проверять (выбирать) отдельные узлы.

По умолчанию нажатые флажки имеют два состояния — нажатый и ненажатый. Если вы установите для свойства AllowIndeterminateCheckState значение true, нажатые флажки поддерживают три состояния — нажато, ненажатое и неопределенное.

Получение и настройка состояния нажатия для узла

Используйте свойство TreeListNode.IsChecked узла для считывания и указания состояния нажатия узла. Свойство TreeListNode.IsChecked имеет логический тип с возможностью обнуления, поэтому вы можете присвоить свойству null для переключения узла в неопределенное состояние.

Получение нажатых (выбранных) узлов

Используйте метод GetAllCheckedNodes для извлечения узлов с нажатым состоянием.

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

Синхронизация состояний нажатия с источником данных

Используйте свойство CheckBoxFieldName, чтобы синхронизировать состояния нажатия узла с определенным полем источника данных. Это свойство определяет имя логического поля или поля источника логических данных с возможностью обнуления, в котором хранятся состояния нажатия для узлов.

Рекурсивная проверка

AllowRecursiveNodeChecking позволяет выполнять рекурсивную проверку узлов. В этом режиме дочерние узлы изменяют свое состояние нажатия, когда изменяется состояние нажатия родительского узла, и наоборот.

Выбор нескольких узлов (выделение)

Контролы TreeList и TreeView поддерживают режим выбора нескольких узлов, который позволяет вам и вашему пользователю выбирать (выделять) несколько узлов одновременно.

Установите для свойства SelectionMode значение Multiple, чтобы включить режим выбора нескольких узлов.

Выбор узлов с помощью мыши и клавиатуры

Пользователи могут выбирать несколько узлов с помощью мыши и клавиатуры. Им нужно щелкать по узлам, удерживая нажатой клавишу CTRL и/или SHIFT.

Работа с выборкой узлов в коде

Следующий API позволяет вам выбирать / отменять выбор узлов и определять, выбран ли узел:

  • SelectAll
  • SelectNode
  • SelectRange
  • UnselectNode
  • ClearSelection
  • IsNodeSelected

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

  • GetSelectedNodes — Возвращает коллекцию выбранных в данный момент объектов TreeListNode.
  • SelectedItems — определяет набор объектов данных (бизнес-объектов), которые соответствуют выбранным узлам.

Обработайте событие SelectionChanged, чтобы отреагировать на изменения в выборе узла.

Вызов любого метода, который изменяет выбранное состояние узла, вызывает обновление контрола TreeList/TreeView и вызывает событие SelectionChanged.

Чтобы выполнить пакетные модификации выбранного узла и предотвратить ненужные обновления, вы можете обернуть код, который изменяет выбранные состояния узлов, парой методов BeginSelection и EndSelection. В этом случае контрол перерисовывает выделение, и событие SelectionChanged срабатывает после вызова метода EndSelection.

treeList1.SelectionMode = Eremex.AvaloniaUI.Controls.DataControl.RowSelectionMode.Multiple;
// Start a batch update of the node selection.
treeList1.BeginSelection();
treeList1.ClearSelection();
treeList1.SelectNode(node1);
treeList1.SelectNode(node2);
//...
// Finish the batch update.
treeList1.EndSelection();

Сфокусированный узел и выбранные узлы

Сфокусированный узел - это узел, который получает пользовательский ввод. В режиме одиночного выбора сфокусированный узел автоматически получает выбранное состояние. Вы можете использовать свойство FocusedNode и метод GetSelectedNodes для извлечения сфокусированного узла.

Выбран узел или нет, можно определить по выделению узла. Выделяются только выбранные узлы.

Сфокусированное и выбранное состояния различаются в режиме выбора нескольких узлов. В этом режиме щелчок по узлу фокусирует и выбирает этот узел одновременно. Пользователь, однако, может переключать выбранное состояние сфокусированного узла, используя следующие действия:

  • Нажмите CTRL+ПРОБЕЛ.
  • Щелкните по выделенному узлу, удерживая нажатой клавишу CTRL.

Когда вы выбираете узел в коде, этот узел не получает сфокусированное состояние в режиме множественного выбора, и наоборот.

Поиск узлов

Метод TreeListControlBase.FindNode позволяет вам находить узлы, соответствующие пользовательским критериям.

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

treeList1.SelectionMode = Eremex.AvaloniaUI.Controls.DataControl.RowSelectionMode.Multiple;
treeList1.ExpandAllNodes();
TreeListNode node1 = treeList1.FindNode(node => (node.Content as Employee).Name.Contains("Sam"));
TreeListNode node2 = treeList1.FindNode(node => (node.Content as Employee).Name.Contains("Dan"));
treeList1.ClearSelection();
treeList1.SelectNode(node1);
treeList1.SelectNode(node2);

Итерация по узлам

Вы можете создать итератор (объект TreeListNodeIterator) для рекурсивного перебора узлов и выполнения над ними операции.

Используйте один из следующих конструкторов для создания объекта TreeListNodeIterator:

// Recursively iterates through child nodes of the specified node, and their children.
public TreeListNodeIterator(TreeListNode? node, bool onlyExpanded = false)

// Recursively iterates through the specified nodes, and their children.
public TreeListNodeIterator(TreeListNodeCollection? nodes, bool onlyExpanded = false)

Параметр onlyExpanded указывает, следует ли выполнять итерацию по развернутым узлам или по развернутым и свернутым узлам.

foreach (var node in new TreeListNodeIterator(treeList1.Nodes))
{
    if (node != null)
    {
        //do smth
    }
}


* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.