From ab2346866d38516d16bb1ee675cdc8a794851434 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Thu, 5 Feb 2026 11:45:31 -0600 Subject: [PATCH] untangle the context menu from global state a bit. --- .../ContextMenuViewModel.cs | 21 +++++++------------ .../Controls/CommandBar.xaml.cs | 10 +++++++++ .../Controls/ContextMenu.xaml.cs | 10 ++------- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/ContextMenuViewModel.cs b/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/ContextMenuViewModel.cs index c974af6461..2d07decdf5 100644 --- a/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/ContextMenuViewModel.cs +++ b/src/modules/cmdpal/Core/Microsoft.CmdPal.Core.ViewModels/ContextMenuViewModel.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation +// Copyright (c) Microsoft Corporation // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. @@ -13,15 +13,20 @@ using Windows.System; namespace Microsoft.CmdPal.Core.ViewModels; -public partial class ContextMenuViewModel : ObservableObject, - IRecipient +public partial class ContextMenuViewModel : ObservableObject { public ICommandBarContext? SelectedItem { get => field; set { + if (field == value) + { + return; + } + field = value; + OnPropertyChanged(nameof(SelectedItem)); UpdateContextItems(); } } @@ -39,16 +44,6 @@ public partial class ContextMenuViewModel : ObservableObject, private string _lastSearchText = string.Empty; - public ContextMenuViewModel() - { - WeakReferenceMessenger.Default.Register(this); - } - - public void Receive(UpdateCommandBarMessage message) - { - SelectedItem = message.ViewModel; - } - public void UpdateContextItems() { if (SelectedItem is not null) diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/CommandBar.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/CommandBar.xaml.cs index 6dbcfd26b3..66c4cf05c6 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/CommandBar.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/CommandBar.xaml.cs @@ -40,6 +40,16 @@ public sealed partial class CommandBar : UserControl, WeakReferenceMessenger.Default.Register(this); WeakReferenceMessenger.Default.Register(this); WeakReferenceMessenger.Default.Register(this); + + ViewModel.PropertyChanged += ViewModel_PropertyChanged; + } + + private void ViewModel_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(CommandBarViewModel.SelectedItem)) + { + ContextControl.ViewModel.SelectedItem = ViewModel.SelectedItem; + } } public void Receive(OpenContextMenuMessage message) diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContextMenu.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContextMenu.xaml.cs index afc2d190ef..49f040b5e5 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContextMenu.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/ContextMenu.xaml.cs @@ -18,7 +18,6 @@ namespace Microsoft.CmdPal.UI.Controls; public sealed partial class ContextMenu : UserControl, IRecipient, - IRecipient, IRecipient { public ContextMenuViewModel ViewModel { get; } = new(); @@ -29,7 +28,6 @@ public sealed partial class ContextMenu : UserControl, // RegisterAll isn't AOT compatible WeakReferenceMessenger.Default.Register(this); - WeakReferenceMessenger.Default.Register(this); WeakReferenceMessenger.Default.Register(this); if (ViewModel is not null) @@ -46,11 +44,6 @@ public sealed partial class ContextMenu : UserControl, UpdateUiForStackChange(); } - public void Receive(UpdateCommandBarMessage message) - { - UpdateUiForStackChange(); - } - public void Receive(TryCommandKeybindingMessage msg) { var result = ViewModel?.CheckKeybinding(msg.Ctrl, msg.Alt, msg.Shift, msg.Win, msg.Key); @@ -138,7 +131,8 @@ public sealed partial class ContextMenu : UserControl, { var prop = e.PropertyName; - if (prop == nameof(ContextMenuViewModel.FilteredItems)) + if (prop == nameof(ContextMenuViewModel.FilteredItems) || + prop == nameof(ContextMenuViewModel.SelectedItem)) { UpdateUiForStackChange(); }