diff --git a/dev/NavigationView/NavigationViewItem.cpp b/dev/NavigationView/NavigationViewItem.cpp index dc7f5c30ab..0b3946bd0c 100644 --- a/dev/NavigationView/NavigationViewItem.cpp +++ b/dev/NavigationView/NavigationViewItem.cpp @@ -492,7 +492,9 @@ void NavigationViewItem::UpdateVisualStateForChevron() bool NavigationViewItem::HasChildren() { - return MenuItems().Size() > 0 || (MenuItemsSource() != nullptr && m_repeater.get().ItemsSourceView().Count() > 0) || HasUnrealizedChildren(); + return MenuItems().Size() > 0 + || (MenuItemsSource() != nullptr && m_repeater != nullptr && m_repeater.get().ItemsSourceView().Count() > 0) + || HasUnrealizedChildren(); } bool NavigationViewItem::ShouldShowIcon() diff --git a/dev/NavigationView/NavigationView_ApiTests/NavigationViewTests.cs b/dev/NavigationView/NavigationView_ApiTests/NavigationViewTests.cs index 6ce7c5ef78..e4fdeb6dbf 100644 --- a/dev/NavigationView/NavigationView_ApiTests/NavigationViewTests.cs +++ b/dev/NavigationView/NavigationView_ApiTests/NavigationViewTests.cs @@ -840,7 +840,7 @@ public void VerifyMenuItemAndContainerMappingMenuItemsSource() var navView = new NavigationView(); MUXControlsTestApp.App.TestContentRoot = navView; - navView.MenuItemsSource = new ObservableCollection { "Item 1", "Item 2" }; ; + navView.MenuItemsSource = new ObservableCollection { "Item 1", "Item 2" }; navView.Width = 1008; // forces the control into Expanded mode so that the menu renders MUXControlsTestApp.App.TestContentRoot.UpdateLayout(); @@ -848,11 +848,11 @@ public void VerifyMenuItemAndContainerMappingMenuItemsSource() var menuItem = "Item 2"; // Get container for item var itemContainer = navView.ContainerFromMenuItem(menuItem) as NavigationViewItem; - bool correctContainerReturned = itemContainer != null && (itemContainer.Content as String) == menuItem; + bool correctContainerReturned = itemContainer != null && (itemContainer.Content as string) == menuItem; Verify.IsTrue(correctContainerReturned, "Correct container should be returned for passed in menu item."); // Get item for container - var returnedItem = navView.MenuItemFromContainer(itemContainer) as String; + var returnedItem = navView.MenuItemFromContainer(itemContainer) as string; bool correctItemReturned = returnedItem != null && returnedItem == menuItem; Verify.IsTrue(correctItemReturned, "Correct item should be returned for passed in container."); @@ -1073,5 +1073,23 @@ public void VerifyClearingItemsCollectionDoesNotCrashWhenItemSelectedOnTopNav() itemsSource.Clear(); }); } + + [TestMethod] + public void VerifyHierarchicalNavigationTopModeMenuItemsSourceDoesNotCrash() + { + RunOnUIThread.Execute(() => + { + var navView = new NavigationView(); + Content = navView; + + navView.PaneDisplayMode = NavigationViewPaneDisplayMode.Top; + + var childItem = new NavigationViewItem() { Content = "Item 1.1" }; + var parentItem = new NavigationViewItem() { Content = "Item 1", MenuItemsSource = new ObservableCollection() { childItem } }; + navView.MenuItemsSource = new ObservableCollection() { parentItem }; + + Content.UpdateLayout(); + }); + } } } \ No newline at end of file