直接用ItemsSource+TreeDataTemplate可实现层级绑定,需数据模型支持递归嵌套且子节点集合为ObservableCollection并实现INotifyPropertyChanged,TreeView自动识别SubNodes属性递归渲染。

直接用 ItemsSource + TreeDataTemplate 就能实现层级绑定,关键是数据模型要支持递归嵌套,且集合类型得是可观察的(比如 ObservableCollection)。
数据模型必须带子节点集合
每个节点类需包含一个表示子项的可观察集合属性,通常叫 Children 或 SubNodes。Avalonia 会自动识别该属性并递归渲染:
- 必须实现
INotifyPropertyChanged(用于响应属性变更) -
Children类型必须是ObservableCollection,不能是List或普通数组 - 子节点对象本身也得符合同样结构,才能继续展开
示例节点类:
public class Node : INotifyPropertyChanged
{
private string _title;
public string Title
{
get => _title;
set { _title = value; OnPropertyChanged(); }
}
public ObservableCollection SubNodes { get; } = new();
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string? name = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
XAML 中用 TreeDataTemplate 声明递归结构
不是用普通 DataTemplate,而是 TreeDataTemplate,并指定其 ItemsSource 绑定到子集合属性:
-
TreeView.ItemTemplate必须是TreeDataTemplate -
ItemsSource属性写在TreeDataTemplate标签内,值为{Binding SubNodes} - 模板内部可自由定义节点外观,比如
TextBlock显示标题
典型写法:
ViewModel 提供根节点集合
TreeView 的 ItemsSource 绑定的是顶层节点集合,它本身也得是可观察的:
- 在 ViewModel 中声明
ObservableCollectionRootNodes { get; } - 初始化时填入一级节点,每个节点再自行填充
SubNodes - 支持动态增删:往某节点的
SubNodes添加新Node,UI 自动更新
例如:
RootNodes = new ObservableCollection{ new Node { Title = "文档" } { SubNodes = { new Node { Title = "README.md" }, new Node { Title = "LICENSE" } } }, new Node { Title = "源码" } { SubNodes = { new Node { Title = "Program.cs" } } } };
展开/折叠和选中状态不用手动处理
Avalonia 默认已支持:
- 点击箭头图标自动展开/收起子节点
- 支持单选(
SelectionMode="Single")或多选(SelectionMode="Multiple") - 选中状态变化会触发
SelectedItem或SelectedItems绑定 - 如需自定义样式,可用
Style针对TreeViewItem的:selected状态设置前景色、背景等
基本上就这些。只要模型对、模板对、集合可观察,层级就自然出来了。不复杂但容易忽略 ObservableCollection 和 INotifyPropertyChanged 这两个关键点。









