/// <summary> /// 在结点被收缩起来时,应该它的子结点的所有数据在_objectItems中对应的项都移除。 /// </summary> /// <param name="treeNode"></param> private void OnNodeCollapsed(TreeGridRow treeNode) { //处理 LazyLoading //结点被折叠后事件。 //如果懒加载开启后,则在折叠时清空所有子结点。 //不处理根结点。 if (treeNode != this.RootNode) { //更新布局 var itemKey = GetId(treeNode.DataContext); _renderExpansion.Remove(itemKey); if (this.IsLazyLoading && this.ClearCollapsedNodes && treeNode.Items.Count > 0) { //deregisters listeners for all ancestors if (this.ObserveChildItems) { _monitor.RemoveNodes(treeNode.Items); } treeNode.ItemsSource = null; TreeGridHelper.CreateDummyItem(treeNode); //TODO do we have collapsed event if all childs are being filtered? //if yes, we need to set the dummy nodes visibility depending //on the filtered childs (visible if at least 1 visible child) } } }
/// <summary> /// Updates the tree with newly added items. /// </summary> /// <param name="observed">The observed collection.</param> /// <param name="e">Collection event args.</param> public void HandleNewChildItems(ICollection observed, NotifyCollectionChangedEventArgs e) { IList childs = e.NewItems; if (childs.Count == 0) { return; } //get the node of the parent item that contains the evented childs var parentNode = GetParentNode(childs[0], observed); if (parentNode == null) { return; } //if the node is expanded or does not load lazily, or //already contains valid items, create nodes if (parentNode.IsExpanded || !tree.IsLazyLoading || !TreeGridHelper.ContainsDummyNode(parentNode)) { var rawLayout = tree._renderExpansion; try { tree._renderExpansion = null; parentNode.ItemsSource = childs; } finally { tree._renderExpansion = rawLayout; } //refresh the node in order to apply sorting (or any other //features that will be incorporated) parentNode.Items.Refresh(); } else if (parentNode.Items.Count == 0) { //if the tree is in lazy loading mode and the item did //not contain any childs before, we have to add a dummy //node to render a expander parentNode.Items.Add(TreeGridHelper.CreateDummyItem()); } }