Skip to content

Commit 4fe1fd5

Browse files
authored
NavigationView: Fix crash when launched in Top mode with hierarchical navigation (#3166)
* Fix crash when launching a hierarchical NavigationView in top mode. * Added API test. * Remove Verify() call.
1 parent 2972f03 commit 4fe1fd5

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

dev/NavigationView/NavigationViewItem.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,9 @@ void NavigationViewItem::UpdateVisualStateForChevron()
492492

493493
bool NavigationViewItem::HasChildren()
494494
{
495-
return MenuItems().Size() > 0 || (MenuItemsSource() != nullptr && m_repeater.get().ItemsSourceView().Count() > 0) || HasUnrealizedChildren();
495+
return MenuItems().Size() > 0
496+
|| (MenuItemsSource() != nullptr && m_repeater != nullptr && m_repeater.get().ItemsSourceView().Count() > 0)
497+
|| HasUnrealizedChildren();
496498
}
497499

498500
bool NavigationViewItem::ShouldShowIcon()

dev/NavigationView/NavigationView_ApiTests/NavigationViewTests.cs

+21-3
Original file line numberDiff line numberDiff line change
@@ -840,19 +840,19 @@ public void VerifyMenuItemAndContainerMappingMenuItemsSource()
840840
var navView = new NavigationView();
841841
MUXControlsTestApp.App.TestContentRoot = navView;
842842

843-
navView.MenuItemsSource = new ObservableCollection<String> { "Item 1", "Item 2" }; ;
843+
navView.MenuItemsSource = new ObservableCollection<string> { "Item 1", "Item 2" };
844844
navView.Width = 1008; // forces the control into Expanded mode so that the menu renders
845845

846846
MUXControlsTestApp.App.TestContentRoot.UpdateLayout();
847847

848848
var menuItem = "Item 2";
849849
// Get container for item
850850
var itemContainer = navView.ContainerFromMenuItem(menuItem) as NavigationViewItem;
851-
bool correctContainerReturned = itemContainer != null && (itemContainer.Content as String) == menuItem;
851+
bool correctContainerReturned = itemContainer != null && (itemContainer.Content as string) == menuItem;
852852
Verify.IsTrue(correctContainerReturned, "Correct container should be returned for passed in menu item.");
853853

854854
// Get item for container
855-
var returnedItem = navView.MenuItemFromContainer(itemContainer) as String;
855+
var returnedItem = navView.MenuItemFromContainer(itemContainer) as string;
856856
bool correctItemReturned = returnedItem != null && returnedItem == menuItem;
857857
Verify.IsTrue(correctItemReturned, "Correct item should be returned for passed in container.");
858858

@@ -1073,5 +1073,23 @@ public void VerifyClearingItemsCollectionDoesNotCrashWhenItemSelectedOnTopNav()
10731073
itemsSource.Clear();
10741074
});
10751075
}
1076+
1077+
[TestMethod]
1078+
public void VerifyHierarchicalNavigationTopModeMenuItemsSourceDoesNotCrash()
1079+
{
1080+
RunOnUIThread.Execute(() =>
1081+
{
1082+
var navView = new NavigationView();
1083+
Content = navView;
1084+
1085+
navView.PaneDisplayMode = NavigationViewPaneDisplayMode.Top;
1086+
1087+
var childItem = new NavigationViewItem() { Content = "Item 1.1" };
1088+
var parentItem = new NavigationViewItem() { Content = "Item 1", MenuItemsSource = new ObservableCollection<NavigationViewItem>() { childItem } };
1089+
navView.MenuItemsSource = new ObservableCollection<NavigationViewItem>() { parentItem };
1090+
1091+
Content.UpdateLayout();
1092+
});
1093+
}
10761094
}
10771095
}

0 commit comments

Comments
 (0)