直接用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));
}
不是用普通 DataTemplate,而是 TreeDataTemplate,并指定其 ItemsSource 绑定到子集合属性:
TreeView.ItemTemplate 必须是 TreeDataTemplate
ItemsSource 属性写在 TreeDataTemplate 标签内,值为 {Binding SubNodes}
TextBlock 显示标题典型写法:
TreeView 的 ItemsSource 绑定的是顶层节点集合,它本身也得是可观察的:
ObservableCollection RootNodes { 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 和 INotifyPropertyChan 这两个关键点。
ged