Loading...
Loading...
Implement Syncfusion Blazor TreeView component for hierarchical data display with single/multi-selection, editing, expand-collapse, checkboxes, drag-drop, and virtualization. Use this skill whenever the user needs to display tree-structured data, enable node selection and editing, implement checkboxes for multi-selection, load data on demand, filter and search nodes, customize node appearance, or handle tree interaction events.
npx skill4agent add syncfusion/blazor-ui-components-skills syncfusion-blazor-treeview// 1. Install NuGet packages
// Install-Package Syncfusion.Blazor.Navigations -Version 26.1.35
// Install-Package Syncfusion.Blazor.Themes -Version 26.1.35
// 2. Add to _Imports.razor
@using Syncfusion.Blazor
@using Syncfusion.Blazor.Navigations
// 3. Register service in Program.cs
builder.Services.AddSyncfusionBlazor();
// 4. Add CSS theme to Index.html or _Layout.cshtml
<link href="_content/Syncfusion.Blazor.Themes/bootstrap5.css" rel="stylesheet" />@using Syncfusion.Blazor.Navigations
<SfTreeView TValue="MailItem">
<TreeViewFieldsSettings TValue="MailItem"
Id="Id"
Text="FolderName"
Child="Children"
DataSource="@MyFolder">
</TreeViewFieldsSettings>
<TreeViewEvents TValue="MailItem" NodeSelected="OnNodeSelected"></TreeViewEvents>
</SfTreeView>
@code {
public class MailItem
{
public string? Id { get; set; }
public string? FolderName { get; set; }
public List<MailItem>? Children { get; set; }
}
void OnNodeSelected(NodeSelectEventArgs args)
{
Console.WriteLine($"Selected: {args.NodeData.Text}");
}
List<MailItem> MyFolder = new()
{
new MailItem { Id = "1", FolderName = "Inbox", Children = new() },
new MailItem { Id = "2", FolderName = "Sent", Children = new() }
};
}| Property | Type | Default | Purpose |
|---|---|---|---|
| bool | false | Enable/disable drag-drop hierarchy reordering |
| bool | false | Allow double-click node renaming |
| bool | false | Enable Ctrl+Click multi-selection |
| bool | false | Display checkboxes for each node |
| bool | true | Auto-check/uncheck children when parent checked |
| bool | false | Persist expanded/selected/checked state to localStorage |
| bool | false | Virtual scrolling for 1000+ nodes (requires Height) |
| string[] | Empty | Initially expanded node IDs (2-way bindable) |
| string[] | Empty | Selected node IDs (2-way bindable) |
| string[] | Empty | Checked node IDs (2-way bindable) |
| bool | true | Load children only when node expands |
| ExpandAction | Click | Trigger expand on Click/DoubleClick/None |
| string | "auto" | Fixed height (required for virtualization) |
| Method | Purpose |
|---|---|
| Expand all nodes |
| Expand specific nodes by ID |
| Collapse all nodes |
| Collapse specific nodes |
| Enter edit mode for a node |
| Get all tree data |
| Get specific node data by ID |
| Scroll to make node visible |
| Check all checkboxes |
| Uncheck all checkboxes |
| Clear all state (selection, expand, check) |
| Event | Fires When | Common Uses |
|---|---|---|
| TreeView initialized | Post-initialization setup, load preferences |
| Data binding complete | Auto-expand default nodes, validate data |
| Node left-clicked | Load node details, enable actions |
| Node clicked | Distinguish single vs double-click |
| Node expanded | Load child nodes (load-on-demand) |
| Node collapsed | Optional: Unload children from memory |
| Before edit mode | Validate permissions, prevent edits |
| Edit confirmed | Validate new text, save to server |
| Drag begins | Prevent dragging restricted nodes |
| Drop completed | Update hierarchy in server |
| Before checkbox changes | Prevent checking restricted nodes |
| Checkbox changed | Update related data, trigger actions |
| Data source updated | Re-apply filters, refresh calculations |
| Action fails (API error) | Recover from errors, show notifications |
| Key pressed | Implement keyboard shortcuts (Delete, F2, etc) |
<SfTreeView TValue="Item" @bind-SelectedNodes="@SelectedIds">
<TreeViewFieldsSettings TValue="Item" DataSource="@Items" />
<TreeViewEvents TValue="Item" NodeSelected="OnSelect"></TreeViewEvents>
</SfTreeView>
@code {
string[] SelectedIds = Array.Empty<string>();
void OnSelect(NodeSelectEventArgs args) => Console.WriteLine(args.NodeData.Text);
}<SfTreeView TValue="Item" AllowMultiSelection="true" @bind-SelectedNodes="@SelectedIds">
<TreeViewFieldsSettings TValue="Item" DataSource="@Items" />
</SfTreeView>void OnNodeExpanded(NodeExpandEventArgs args)
{
if (args.NodeData.HasChild && args.NodeData.Child == null)
{
// Load children from API
args.NodeData.Child = await FetchChildren(args.NodeData.Id);
}
}<SfTreeView TValue="Item" AllowDragAndDrop="true">
<TreeViewFieldsSettings TValue="Item" DataSource="@Items" />
<TreeViewEvents TValue="Item" NodeDropped="OnDropped"></TreeViewEvents>
</SfTreeView>
void OnDropped(DragAndDropEventArgs args) => UpdateHierarchy(args);<SfTreeView TValue="Item" AllowEditing="true" DoubleClickAction="DoubleClickAction.Edit">
<TreeViewFieldsSettings TValue="Item" DataSource="@Items" />
<TreeViewEvents TValue="Item" NodeEdited="OnEdited"></TreeViewEvents>
</SfTreeView>
void OnEdited(NodeEditEventArgs args) => SaveChanges(args.NodeData);<SfTreeView TValue="Item" AllowCheckBoxes="true" ChildChecking="ChildCheckState.Both">
<TreeViewFieldsSettings TValue="Item" DataSource="@Items" />
</SfTreeView>
var checked = treeRef.GetAllCheckedNodes();