Primary WPF APIs:
TreeViewHierarchicalDataTemplateTreeViewItem.IsExpanded, selection behaviorsPrimary Avalonia APIs:
TreeViewTreeDataTemplate / FuncTreeDataTemplate<T>TreeViewItem.IsExpanded, Expanded/Collapsed eventsTreeView.SelectionMode, SelectedItem, AutoScrollToSelectedItem| WPF | Avalonia |
|---|---|
HierarchicalDataTemplate ItemsSource=... |
TreeDataTemplate ItemsSource=... |
TreeViewItem.IsExpanded two-way state |
TreeViewItem.IsExpanded two-way state |
| selected node workflows | SelectedItem and SelectionMode on TreeView |
| lazy child load on expand | handle TreeViewItem.Expanded and load node children |
WPF XAML:
<TreeView ItemsSource="{Binding RootNodes}"
SelectedItemChanged="OnSelectedItemChanged">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type vm:NodeViewModel}"
ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Title}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Avalonia XAML:
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:MyApp.ViewModels"
x:DataType="vm:ExplorerViewModel">
<TreeView ItemsSource="{CompiledBinding RootNodes}"
SelectedItem="{CompiledBinding SelectedNode, Mode=TwoWay}"
SelectionMode="Single"
AutoScrollToSelectedItem="True">
<TreeView.ItemTemplate>
<TreeDataTemplate x:DataType="vm:NodeViewModel"
ItemsSource="{CompiledBinding Children}">
<TextBlock Text="{CompiledBinding Title}" />
</TreeDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</UserControl>
using Avalonia.Controls;
using Avalonia.Controls.Templates;
using Avalonia.Interactivity;
var tree = new TreeView
{
ItemsSource = viewModel.RootNodes,
SelectionMode = SelectionMode.Single,
AutoScrollToSelectedItem = true,
ItemTemplate = new FuncTreeDataTemplate<NodeViewModel>(
(node, _) => new TextBlock { Text = node.Title },
node => node.Children)
};
tree.AddHandler(TreeViewItem.ExpandedEvent, (_, e) =>
{
if (e.Source is TreeViewItem { DataContext: NodeViewModel node } && !node.ChildrenLoaded)
{
node.LoadChildren();
}
}, RoutingStrategies.Bubble);
TreeDataTemplate.ItemsSource binding and ensure children collection notifications are raised.