diff --git a/dev/TreeView/APITests/TreeViewTests.cs b/dev/TreeView/APITests/TreeViewTests.cs index f2412402f1..7db3c342ca 100644 --- a/dev/TreeView/APITests/TreeViewTests.cs +++ b/dev/TreeView/APITests/TreeViewTests.cs @@ -667,6 +667,49 @@ public void TreeViewSelectionChangedMultipleMode() }); } + [TestMethod] + public void RemovingLastChildrenSetsIsExpandedToFalse() + { + RunOnUIThread.Execute(() => + { + var treeViewRoot = new TreeViewNode(); + var treeViewNode1 = new TreeViewNode(); + var treeViewNode2 = new TreeViewNode(); + var treeViewNode3 = new TreeViewNode(); + var treeViewNode4 = new TreeViewNode(); + var treeViewNode5 = new TreeViewNode(); + + // Need root since in TreeView we otherwise + // could collapse whole tree and hide it forever + treeViewRoot.Children.Add(treeViewNode1); + + treeViewNode1.Children.Add(treeViewNode2); + treeViewNode1.Children.Add(treeViewNode3); + treeViewNode1.Children.Add(treeViewNode4); + treeViewNode1.Children.Add(treeViewNode5); + + treeViewNode1.IsExpanded = true; + Verify.IsTrue(treeViewNode1.IsExpanded); + + treeViewNode1.Children.Clear(); + Verify.IsFalse(treeViewNode1.IsExpanded); + + treeViewNode1.Children.Add(treeViewNode2); + treeViewNode1.IsExpanded = true; + Verify.IsTrue(treeViewNode1.IsExpanded); + + treeViewNode1.Children.Remove(treeViewNode2); + Verify.IsFalse(treeViewNode1.IsExpanded); + + treeViewNode1.Children.Add(treeViewNode2); + treeViewNode1.IsExpanded = true; + Verify.IsTrue(treeViewNode1.IsExpanded); + + treeViewNode1.Children.RemoveAt(0); + Verify.IsFalse(treeViewNode1.IsExpanded); + }); + } + private bool IsMultiSelectCheckBoxChecked(TreeView tree, TreeViewNode node) { var treeViewItem = tree.ContainerFromNode(node) as TreeViewItem; diff --git a/dev/TreeView/TreeViewNode.cpp b/dev/TreeView/TreeViewNode.cpp index d1b069ff4f..773f25462f 100644 --- a/dev/TreeView/TreeViewNode.cpp +++ b/dev/TreeView/TreeViewNode.cpp @@ -231,7 +231,7 @@ void TreeViewNode::SyncChildrenNodesWithItemsSource() if (!AreChildrenNodesEqualToItemsSource()) { auto children = winrt::get_self(Children()); - children->Clear(false /* updateItemsSource */); + children->Clear(false /* updateItemsSource */, false /* updateIsExpanded */); auto size = m_itemsDataSource ? m_itemsDataSource.Count() : 0; for (auto i = 0; i < size; i++) @@ -383,11 +383,11 @@ void TreeViewNodeVector::InsertAt(unsigned int index, winrt::TreeViewNode const& void TreeViewNodeVector::SetAt(unsigned int index, winrt::TreeViewNode const& item, bool updateItemsSource) { - RemoveAt(index, updateItemsSource); + RemoveAt(index, updateItemsSource,false /* updateIsExpanded */); InsertAt(index, item, updateItemsSource); } -void TreeViewNodeVector::RemoveAt(unsigned int index, bool updateItemsSource) +void TreeViewNodeVector::RemoveAt(unsigned int index, bool updateItemsSource,bool updateIsExpanded) { auto inner = GetVectorInnerImpl(); auto targetNode = inner->GetAt(index); @@ -402,6 +402,19 @@ void TreeViewNodeVector::RemoveAt(unsigned int index, bool updateItemsSource) source.RemoveAt(index); } } + + // No children, so close parent if not requested otherwise + if (updateIsExpanded && inner->Size() == 0) + { + if (auto&& ownerNode = m_parent.get()) + { + // Only set IsExpanded to false if we are not the root node + if (auto&& ownerParent = ownerNode.Parent()) + { + ownerNode.IsExpanded(false); + } + } + } } void TreeViewNodeVector::RemoveAtEnd(bool updateItemsSource) @@ -435,7 +448,7 @@ void TreeViewNodeVector::ReplaceAll(winrt::array_view } } -void TreeViewNodeVector::Clear(bool updateItemsSource) +void TreeViewNodeVector::Clear(bool updateItemsSource,bool updateIsExpanded) { auto inner = GetVectorInnerImpl(); auto count = inner->Size(); @@ -458,6 +471,18 @@ void TreeViewNodeVector::Clear(bool updateItemsSource) } } } + + if (updateIsExpanded) + { + if(auto&& ownerNode = m_parent.get()) + { + // Only set IsExpanded to false if we are not the root node + if (auto&& ownerParent = ownerNode.Parent()) + { + ownerNode.IsExpanded(false); + } + } + } } #pragma endregion diff --git a/dev/TreeView/TreeViewNode.h b/dev/TreeView/TreeViewNode.h index 404550e604..c97dbf43bc 100644 --- a/dev/TreeView/TreeViewNode.h +++ b/dev/TreeView/TreeViewNode.h @@ -109,8 +109,8 @@ class TreeViewNodeVector : void Append(winrt::TreeViewNode const& item, bool updateItemsSource = true); void InsertAt(unsigned int index, winrt::TreeViewNode const& item, bool updateItemsSource = true); void SetAt(unsigned int index, winrt::TreeViewNode const& item, bool updateItemsSource = true); - void RemoveAt(unsigned int index, bool updateItemsSource = true); + void RemoveAt(unsigned int index, bool updateItemsSource = true, bool updateIsExpanded = true); void RemoveAtEnd(bool updateItemsSource = true); void ReplaceAll(winrt::array_view values, bool updateItemsSource = true); - void Clear(bool updateItemsSource = true); + void Clear(bool updateItemsSource = true, bool updateIsExpanded = true); };