I am using Infragistics V16.1 . I am giving snipped of code where the issue occurs
Here ParentColl is ObservableCollection of TreeElement which has children of Type TreeElement bind to XamDataTree.
Xaml:
<ig:XamDataTree x:Name="MyTree" Grid.Row="0" AllowDrop="True" DisplayMemberPath="Name" ItemsSource="{Binding ParentColl}"> <ig:XamDataTree.GlobalNodeLayouts> <ig:NodeLayout Key="ParentLayout" TargetTypeName="TreeElement" IsDraggable="True" IsDropTarget="True" DisplayMemberPath="Name"/> </ig:XamDataTree.GlobalNodeLayouts> </ig:XamDataTree>
On the click of a button I am trying to remove the childitem when parent is collapsed . Here is sample
TreeElement ChildItem = Parent.Children.FirstOrDefault();
Parent.Children.Remove(ChildItem);
The System.NullReferenceException is thrown only when Parent is collapsed. Help me find a solution.
Exception Thrown is below:
at Infragistics.Controls.Menus.NodeLayout.UnSubscribeForNotificationsForNodeData(Object nodeData) at Infragistics.Controls.Menus.NodesManager.DataManager_CollectionChanged(Object sender, NotifyCollectionChangedEventArgs e) at Infragistics.DataManagerBase.OnCollectionChanged(NotifyCollectionChangedEventArgs e) at Infragistics.DataManagerBase.OnDataSourceCollectionChanged(NotifyCollectionChangedEventArgs e) at Infragistics.DataManager`1.OnDataSourceCollectionChanged(NotifyCollectionChangedEventArgs e) at Infragistics.DataManagerBase.<SetDataSource>b__9(DataManagerBase instance, Object s, NotifyCollectionChangedEventArgs e) at Infragistics.WeakEventHandler`3.OnEvent(Object source, TEventArgs eventArgs) at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e) at System.Collections.ObjectModel.ObservableCollection`1.RemoveItem(Int32 index) at System.Collections.ObjectModel.Collection`1.Remove(T item)
Hello Vetriselvan,XamDataTree nodes are virtualized to improve the performance when the control has a large amount of items. When you try to access a child element of a node which is not expanded, this child element is not rendered because it is not in view and that will cause a NullReferenceException.To access the UI element which is not in view you can turn off the virtualization by placing the XamDataGrid in a container which measures its children with infinite height e.g. StackPanel or ScrollViewer. Another approach would be to operate with the data source of the XamDataTree and remove the element from there so it is no longer displayed as a node.Please feel free to let me know if you have any questions.
I am not accessing the UI Element. I am only removing from the datasource . Can you give me sample if what i am doing below is not what you are referrring to
Please see the piece of code
Here ParentColl is the datasource.
ObservableCollection<TreeElement> ParentColl;
TreeElement Parent = ParentColl[1];
<ig:XamDataTree x:Name="MyTree" AllowDrop="True" DisplayMemberPath="Name" ItemsSource="{Binding ParentColl}"> <ig:XamDataTree.GlobalNodeLayouts> <ig:NodeLayout Key="ParentLayout" TargetTypeName="TreeElement" IsDraggable="True" IsDropTarget="True" DisplayMemberPath="Name"/> </ig:XamDataTree.GlobalNodeLayouts> </ig:XamDataTree>
Adding the Class for Parent for your reference:
public class TreeElement
{ private ObservableCollection<TreeElement> _childNodes;
public string Name { get; set; }
public ObservableCollection<TreeElement> Children { get { if (this._childNodes == null) this._childNodes = new ObservableCollection<TreeElement>();
return this._childNodes; } }
}