Skip to content

Commit

Permalink
NavigationView: Fix crash when launched in Top mode with hierarchical…
Browse files Browse the repository at this point in the history
… navigation (#3166)

* Fix crash when launching a hierarchical NavigationView in top mode.

* Added API test.

* Remove Verify() call.
  • Loading branch information
Felix-Dev authored Sep 9, 2020
1 parent 2972f03 commit 4fe1fd5
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
4 changes: 3 additions & 1 deletion dev/NavigationView/NavigationViewItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
24 changes: 21 additions & 3 deletions dev/NavigationView/NavigationView_ApiTests/NavigationViewTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -840,19 +840,19 @@ public void VerifyMenuItemAndContainerMappingMenuItemsSource()
var navView = new NavigationView();
MUXControlsTestApp.App.TestContentRoot = navView;

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

MUXControlsTestApp.App.TestContentRoot.UpdateLayout();

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.");

Expand Down Expand Up @@ -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<NavigationViewItem>() { childItem } };
navView.MenuItemsSource = new ObservableCollection<NavigationViewItem>() { parentItem };

Content.UpdateLayout();
});
}
}
}

0 comments on commit 4fe1fd5

Please sign in to comment.