This is a MSDN question asked by
WPF tree view how do I add to the selected item
, the source is
WPF tree view how do I add to the selected item
.
public List<TreeViewList> treelist = new List<TreeViewList>();
private void AddFolder_Click(object sender, RoutedEventArgs e)
if (list.SelectedItem != null)
var listof = (list.ItemsSource as List<TreeViewList>);
int curIndex = listof.IndexOf(list.SelectedItem as TreeViewList);
listof[curIndex].Children.Add(person);
catch
var listof = (list.ItemsSource as List<TreeViewList>);
for (int a = 0; a < listof.Count; a++)
for (int b = 0; b < listof[a].Children.Count; b++)
if (list.SelectedItem == listof[a].Children[b])
listof[a].Children[b].Children.Add(person);
public class TreeViewList
public string Name { get; set; }
public TreeViewList()
Children = new ObservableCollection<TreeViewList>();
public ObservableCollection<TreeViewList> Children { get; set; }
use ObservableCollection instead of list,
use SelectedItemChanged event to get SelectedItem.
Try following demo. Demo use Interaction and MVVM.
XAML:
<Window x:Class="WpfApp1.Window13"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp13"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
mc:Ignorable="d"
Title="Window13" Height="450" Width="800">
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<StackPanel>
<Button Content="Add new person" Command="{Binding Cmd}"/>
<TreeView ItemsSource="{Binding View}" Margin="5">
<i:Interaction.Behaviors>
<local:TreeViewBehavior/>
</i:Interaction.Behaviors>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:TreeViewList}"
ItemsSource="{Binding Children}">
<Label Content="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</StackPanel>
</Window>
Code:
using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interactivity;
namespace WpfApp13
public class ViewModel
public ObservableCollection<TreeViewList> treelist = new ObservableCollection<TreeViewList>();
public ObservableCollection<TreeViewList> View { get => treelist; }
public TreeViewList SelectedItem { get; set; }
public ICommand Cmd { get => new RelayCommand(AddFolder_Click); }
private int nr = 1;
private TreeViewList person { get => new TreeViewList() { Name = $"Name {nr++}" }; }
private void AddFolder_Click(object state)
if (SelectedItem == null) treelist.Add(person); else SelectedItem.Children.Add(person);
public class TreeViewList
public string Name { get; set; }
public ObservableCollection<TreeViewList> Children { get; set; } = new ObservableCollection<TreeViewList>();
public class TreeViewBehavior : Behavior<TreeView>
protected override void OnAttached()
AssociatedObject.SelectedItemChanged += AssociatedObject_SelectedItemChanged;
private void AssociatedObject_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
var tv = sender as TreeView;
if (tv == null) return;
var vm = tv.DataContext as ViewModel;
if (vm == null) return;
vm.SelectedItem = tv.SelectedItem as TreeViewList;
public class RelayCommand : ICommand
private readonly Predicate<object> _canExecute;
private readonly Action<object> _action;
public RelayCommand(Action<object> action) { _action = action; _canExecute = null; }
public void Execute(object o) => _action(o);
public bool CanExecute(object o) => _canExecute == null ? true : _canExecute(o);
public event EventHandler CanExecuteChanged
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
Thanks.