Узлы
Класс 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
}
}
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.