To reproduce:
public BlankTreeView()
{
InitializeComponent();
RadContextMenu menu = new RadContextMenu();
RadMenuItem addItem = new RadMenuItem("Add");
addItem.Click += addItem_Click;
menu.Items.Add(addItem);
this.radTreeView1.RadContextMenu = menu;
BindingList<ParentObject> items = new BindingList<ParentObject>();
for (int i = 0; i < 3; i++)
{
BindingList<ChildObject> subItems = new BindingList<ChildObject>();
for (int j = 0; j < 10; j++)
{
subItems.Add(new ChildObject(j,"SubNode" + i + "." + j));
}
items.Add(new ParentObject(i ,"Node" + i,subItems));
}
this.radTreeView1.DataSource = items;
this.radTreeView1.DisplayMember = "Title\\Description";
this.radTreeView1.ChildMember = "ParentObject\\Children";
}
private void addItem_Click(object sender, EventArgs e)
{
if (this.radTreeView1.SelectedNode != null)
{
if (this.radTreeView1.SelectedNode.Level == 0)
{
Random rand = new Random();
ParentObject dataItem = this.radTreeView1.SelectedNode.DataBoundItem as ParentObject;
if (dataItem != null)
{
dataItem.Children.Add(new ChildObject(rand.Next(0, 100),"New Node"));
}
}
}
}
public class ParentObject: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private int id;
private string title;
private BindingList<ChildObject> children;
public int ID
{
get
{
return this.id;
}
set
{
this.id = value;
OnPropertyChanged("ID");
}
}
public string Title
{
get
{
return this.title;
}
set
{
this.title = value;
OnPropertyChanged("Title");
}
}
public BindingList<ChildObject> Children
{
get
{
return this.children;
}
set
{
this.children = value;
OnPropertyChanged("Children");
}
}
public ParentObject(int iD, string title, BindingList<ChildObject> children)
{
this.ID = iD;
this.Title = title;
this.Children = children;
}
}
public class ChildObject: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int id;
private string description;
public int ID
{
get
{
return this.id;
}
set
{
this.id = value;
OnPropertyChanged("ID");
}
}
public string Description
{
get
{
return this.description;
}
set
{
this.description = value;
OnPropertyChanged("Description");
}
}
public ChildObject(int iD, string description)
{
this.id = iD;
this.description = description;
}
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Workaround: reset the TreeViewElement after adding the record:
radTreeView1.TreeViewElement.Update(RadTreeViewElement.UpdateActions.Reset);