Skip to content

Commit cbc9be8

Browse files
committed
NavigationView: Fix crash when launched in Top mode with hierarchical navigation (microsoft/microsoft-ui-xaml#3166)
1 parent 6fb9ff6 commit cbc9be8

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

ModernWpf.Controls/NavigationView/NavigationViewItem.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,9 @@ void UpdateVisualStateForChevron()
516516

517517
internal bool HasChildren()
518518
{
519-
return MenuItems.Count > 0 || (MenuItemsSource != null && m_repeater.ItemsSourceView.Count > 0) || HasUnrealizedChildren;
519+
return MenuItems.Count > 0
520+
|| (MenuItemsSource != null && m_repeater != null && m_repeater.ItemsSourceView.Count > 0)
521+
|| HasUnrealizedChildren;
520522
}
521523

522524
bool ShouldShowIcon()

test/ModernWpfTestApp/ApiTests/NavigationViewTests.cs

+21-3
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ public void VerifyMenuItemAndContainerMappingMenuItemsSource()
846846
var navView = new NavigationView();
847847
MUXControlsTestApp.App.TestContentRoot = navView;
848848

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

852852
MUXControlsTestApp.App.TestContentRoot.UpdateLayout(true);
@@ -855,11 +855,11 @@ public void VerifyMenuItemAndContainerMappingMenuItemsSource()
855855
var menuItem = "Item 2";
856856
// Get container for item
857857
var itemContainer = navView.ContainerFromMenuItem(menuItem) as NavigationViewItem;
858-
bool correctContainerReturned = itemContainer != null && (itemContainer.Content as String) == menuItem;
858+
bool correctContainerReturned = itemContainer != null && (itemContainer.Content as string) == menuItem;
859859
Verify.IsTrue(correctContainerReturned, "Correct container should be returned for passed in menu item.");
860860

861861
// Get item for container
862-
var returnedItem = navView.MenuItemFromContainer(itemContainer) as String;
862+
var returnedItem = navView.MenuItemFromContainer(itemContainer) as string;
863863
bool correctItemReturned = returnedItem != null && returnedItem == menuItem;
864864
Verify.IsTrue(correctItemReturned, "Correct item should be returned for passed in container.");
865865

@@ -1080,5 +1080,23 @@ public void VerifyClearingItemsCollectionDoesNotCrashWhenItemSelectedOnTopNav()
10801080
itemsSource.Clear();
10811081
});
10821082
}
1083+
1084+
[TestMethod]
1085+
public void VerifyHierarchicalNavigationTopModeMenuItemsSourceDoesNotCrash()
1086+
{
1087+
RunOnUIThread.Execute(() =>
1088+
{
1089+
var navView = new NavigationView();
1090+
Content = navView;
1091+
1092+
navView.PaneDisplayMode = NavigationViewPaneDisplayMode.Top;
1093+
1094+
var childItem = new NavigationViewItem() { Content = "Item 1.1" };
1095+
var parentItem = new NavigationViewItem() { Content = "Item 1", MenuItemsSource = new ObservableCollection<NavigationViewItem>() { childItem } };
1096+
navView.MenuItemsSource = new ObservableCollection<NavigationViewItem>() { parentItem };
1097+
1098+
Content.UpdateLayout();
1099+
});
1100+
}
10831101
}
10841102
}

0 commit comments

Comments
 (0)