diff --git a/dev/TreeView/InteractionTests/TreeViewTests.cs b/dev/TreeView/InteractionTests/TreeViewTests.cs
index a42ac4a8b1..3a82355e01 100644
--- a/dev/TreeView/InteractionTests/TreeViewTests.cs
+++ b/dev/TreeView/InteractionTests/TreeViewTests.cs
@@ -2815,6 +2815,34 @@ public void ItemsSourceResyncTest()
}
}
+ [TestMethod]
+ [TestProperty("TestSuite", "B")]
+ public void ItemsSourceSwitchForthAndBackTest()
+ {
+ // TreeView databinding only works on RS5+
+ if (IsLowerThanRS5())
+ {
+ return;
+ }
+
+ using (var setup = new TestSetupHelper("TreeView Tests"))
+ {
+ SetContentMode(true);
+
+ ClickButton("SwapItemsSource");
+ Wait.ForIdle();
+ ClickButton("GetItemCount");
+ Verify.AreEqual("2", ReadResult());
+
+ ClickButton("SwapItemsSource");
+ Wait.ForIdle();
+ ClickButton("ExpandRootNode");
+ Wait.ForIdle();
+ ClickButton("GetItemCount");
+ Verify.AreEqual("4", ReadResult());
+ }
+ }
+
private void ClickButton(string buttonName)
{
var button = new Button(FindElement.ByName(buttonName));
diff --git a/dev/TreeView/TestUI/TreeViewPage.xaml b/dev/TreeView/TestUI/TreeViewPage.xaml
index b6c0bbcd1e..680f5c3f83 100644
--- a/dev/TreeView/TestUI/TreeViewPage.xaml
+++ b/dev/TreeView/TestUI/TreeViewPage.xaml
@@ -74,6 +74,7 @@
+
diff --git a/dev/TreeView/TestUI/TreeViewPage.xaml.cs b/dev/TreeView/TestUI/TreeViewPage.xaml.cs
index 8eabd6aaf1..13db323277 100644
--- a/dev/TreeView/TestUI/TreeViewPage.xaml.cs
+++ b/dev/TreeView/TestUI/TreeViewPage.xaml.cs
@@ -998,5 +998,17 @@ private void ExpandRootNode_Click(object sender, RoutedEventArgs e)
{
TestTreeViewItemsSource[0].IsExpanded = !TestTreeViewItemsSource[0].IsExpanded;
}
+
+ private void SwapItemsSource_Click(object sender, RoutedEventArgs e)
+ {
+ if (ContentModeTestTreeView.ItemsSource == TestTreeView2ItemsSource)
+ {
+ this.ContentModeTestTreeView.ItemsSource = TestTreeViewItemsSource;
+ }
+ else
+ {
+ this.ContentModeTestTreeView.ItemsSource = TestTreeView2ItemsSource;
+ }
+ }
}
}
diff --git a/dev/TreeView/TreeViewItem.cpp b/dev/TreeView/TreeViewItem.cpp
index c11906f27b..f0d4f86664 100644
--- a/dev/TreeView/TreeViewItem.cpp
+++ b/dev/TreeView/TreeViewItem.cpp
@@ -322,16 +322,7 @@ void TreeViewItem::OnPropertyChanged(const winrt::DependencyPropertyChangedEvent
}
else if (property == s_ItemsSourceProperty)
{
- winrt::IInspectable value = args.NewValue();
-
- auto treeViewNode = winrt::get_self(node);
- treeViewNode->ItemsSource(value);
- if (IsInContentMode())
- {
- // The children have changed, validate and update GlyphOpacity
- bool hasChildren = HasUnrealizedChildren() || treeViewNode->HasChildren();
- GlyphOpacity(hasChildren ? 1.0 : 0.0);
- }
+ SetItemsSource(node, args.NewValue());
}
else if (property == s_HasUnrealizedChildrenProperty)
{
@@ -341,6 +332,18 @@ void TreeViewItem::OnPropertyChanged(const winrt::DependencyPropertyChangedEvent
}
}
+void TreeViewItem::SetItemsSource(winrt::TreeViewNode const& node, winrt::IInspectable const& value)
+{
+ auto treeViewNode = winrt::get_self(node);
+ treeViewNode->ItemsSource(value);
+ if (IsInContentMode())
+ {
+ // The children have changed, validate and update GlyphOpacity
+ bool hasChildren = HasUnrealizedChildren() || treeViewNode->HasChildren();
+ GlyphOpacity(hasChildren ? 1.0 : 0.0);
+ }
+}
+
void TreeViewItem::OnExpandContentTimerTick(const winrt::IInspectable& /*sender*/, const winrt::IInspectable& /*e*/)
{
if (m_expandContentTimer)
diff --git a/dev/TreeView/TreeViewItem.h b/dev/TreeView/TreeViewItem.h
index f3ee410e74..463d8e8d8e 100644
--- a/dev/TreeView/TreeViewItem.h
+++ b/dev/TreeView/TreeViewItem.h
@@ -39,6 +39,8 @@ class TreeViewItem :
void OnPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args);
+ void SetItemsSource(winrt::TreeViewNode const& node, winrt::IInspectable const& value);
+
public:
// IFrameworkElementOverrides
void OnApplyTemplate();
diff --git a/dev/TreeView/TreeViewList.cpp b/dev/TreeView/TreeViewList.cpp
index 8dc29ea1d1..fc4bf3595c 100644
--- a/dev/TreeView/TreeViewList.cpp
+++ b/dev/TreeView/TreeViewList.cpp
@@ -100,7 +100,18 @@ void TreeViewList::OnContainerContentChanging(const winrt::IInspectable& /*sende
{
auto targetItem = args.ItemContainer().as();
auto targetNode = NodeFromContainer(targetItem);
+
auto treeViewItem = winrt::get_self(targetItem);
+ auto treeViewNode = winrt::get_self(targetNode);
+
+ if (auto itemsSource = targetItem.ItemsSource())
+ {
+ if (treeViewNode->ItemsSource() == nullptr)
+ {
+ treeViewItem->SetItemsSource(targetNode, itemsSource);
+ }
+ }
+
treeViewItem->UpdateIndentation(targetNode.Depth());
treeViewItem->UpdateSelectionVisual(winrt::get_self(targetNode)->SelectionState());
}