diff --git a/dev/NavigationView/NavigationViewItemAutomationPeer.cpp b/dev/NavigationView/NavigationViewItemAutomationPeer.cpp index d3485723fc..bb7ebaaaaa 100644 --- a/dev/NavigationView/NavigationViewItemAutomationPeer.cpp +++ b/dev/NavigationView/NavigationViewItemAutomationPeer.cpp @@ -46,6 +46,9 @@ winrt::hstring NavigationViewItemAutomationPeer::GetNameCore() winrt::IInspectable NavigationViewItemAutomationPeer::GetPatternCore(winrt::PatternInterface const& pattern) { + // Note: We are intentionally not supporting Invoke Pattern, since supporting both SelectionItem and Invoke was + // causing problems. + // See this Issue for more details: https://github.com/microsoft/microsoft-ui-xaml/issues/2702 if (pattern == winrt::PatternInterface::SelectionItem || // Only provide expand collapse pattern if we have children! (pattern == winrt::PatternInterface::ExpandCollapse && HasChildren())) @@ -365,6 +368,11 @@ void NavigationViewItemAutomationPeer::RemoveFromSelection() void NavigationViewItemAutomationPeer::ChangeSelection(bool isSelected) { + // If the item is being selected, we trigger an invoke as if the user had clicked on the item: + if(isSelected) + { + Invoke(); + } if (auto nvi = Owner().try_as()) { nvi.IsSelected(isSelected); diff --git a/dev/NavigationView/NavigationView_InteractionTests/SelectionTests.cs b/dev/NavigationView/NavigationView_InteractionTests/SelectionTests.cs index 52b1366d80..d284f34a33 100644 --- a/dev/NavigationView/NavigationView_InteractionTests/SelectionTests.cs +++ b/dev/NavigationView/NavigationView_InteractionTests/SelectionTests.cs @@ -350,6 +350,28 @@ public void VerifySelectedItemInInvokedItem() Verify.AreEqual("ItemWasInvokedSecomdTimeWithCorrectSelection", result.GetText()); } } + + [TestMethod] + public void VerifySelectionItemPatternDoesInvoke() + { + // When using UIA SelectionItem pattern to select a navview item, this should also trigger an + // invoke on the item. + using (var setup = new TestSetupHelper(new[] { "NavigationView Tests", "NavigationView Test" })) + { + var musicItem = FindElement.ByName("Music"); + var lvi = new ListViewItem(musicItem); + + lvi.Select(); + Wait.ForIdle(); + + Log.Comment("Verify item was invoked"); + var result = new TextBlock(FindElement.ByName("InvokedItemState")); + Verify.AreEqual("ItemWasSelectedInItemInvoked", result.GetText()); + + Log.Comment("Verify item got selected"); + Verify.IsTrue(Convert.ToBoolean(musicItem.GetProperty(UIProperty.Get("SelectionItem.IsSelected")))); + } + } [TestMethod] public void VerifyNavigationViewItemIsSelectedWorks()