diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Dock/DockViewModel.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Dock/DockViewModel.cs index e819f887a3..e7063e0c47 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Dock/DockViewModel.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Dock/DockViewModel.cs @@ -29,7 +29,7 @@ public sealed partial class DockViewModel public ObservableCollection EndItems { get; } = new(); - public ObservableCollection AllItems => _topLevelCommandManager.DockBands; + public IReadOnlyList AllItems => _topLevelCommandManager.GetDockBandsSnapshot(); public DockViewModel( TopLevelCommandManager tlcManager, diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/TopLevelCommandManager.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/TopLevelCommandManager.cs index 907a4f1d86..dc4372308a 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/TopLevelCommandManager.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/TopLevelCommandManager.cs @@ -585,9 +585,9 @@ public sealed partial class TopLevelCommandManager : ObservableObject, // Then find all the top-level commands that belonged to that extension List commandsToRemove = []; List bandsToRemove = []; - lock (TopLevelCommands) + foreach (var extension in extensions) { - foreach (var extension in extensions) + lock (TopLevelCommands) { foreach (var command in TopLevelCommands) { @@ -597,7 +597,10 @@ public sealed partial class TopLevelCommandManager : ObservableObject, commandsToRemove.Add(command); } } + } + lock (_dockBandsLock) + { foreach (var band in DockBands) { var host = band.ExtensionHost; @@ -675,6 +678,14 @@ public sealed partial class TopLevelCommandManager : ObservableObject, return null; } + public List GetDockBandsSnapshot() + { + lock (_dockBandsLock) + { + return [.. DockBands]; + } + } + public void Receive(ReloadCommandsMessage message) => _ = ReloadAllCommandsAsync(); diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Settings/DockSettingsPage.xaml.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI/Settings/DockSettingsPage.xaml.cs index ccca73f80e..666049285d 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Settings/DockSettingsPage.xaml.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Settings/DockSettingsPage.xaml.cs @@ -178,7 +178,7 @@ public sealed partial class DockSettingsPage : Page var tlcManager = App.Current.Services.GetService()!; - foreach (var item in tlcManager.DockBands) + foreach (var item in tlcManager.GetDockBandsSnapshot()) { if (item.IsDockBand) { @@ -197,7 +197,7 @@ public sealed partial class DockSettingsPage : Page var tlcManager = App.Current.Services.GetService()!; var settingsModel = App.Current.Services.GetService()!; var dockViewModel = App.Current.Services.GetService()!; - var allBands = tlcManager.DockBands; + var allBands = tlcManager.GetDockBandsSnapshot(); foreach (var band in allBands) { var setting = band.DockBandSettings;