diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/ListViewModel.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/ListViewModel.cs index 31b2c3c0de21..7774d4686bff 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/ListViewModel.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/ListViewModel.cs @@ -61,6 +61,8 @@ public partial class ListViewModel : PageViewModel, IDisposable private Task? _initializeItemsTask; private CancellationTokenSource? _cancellationTokenSource; + private ListItemViewModel? _lastSelectedItem; + public override bool IsInitialized { get => base.IsInitialized; protected set @@ -330,6 +332,11 @@ private void InvokeSecondaryCommand(ListItemViewModel? item) [RelayCommand] private void UpdateSelectedItem(ListItemViewModel? item) { + if (_lastSelectedItem != null) + { + _lastSelectedItem.PropertyChanged -= SelectedItemPropertyChanged; + } + if (item != null) { SetSelectedItem(item); @@ -367,6 +374,43 @@ private void SetSelectedItem(ListItemViewModel item) TextToSuggest = item.TextToSuggest; }); + + _lastSelectedItem = item; + _lastSelectedItem.PropertyChanged += SelectedItemPropertyChanged; + } + + private void SelectedItemPropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) + { + var item = _lastSelectedItem; + if (item == null) + { + return; + } + + // already on the UI thread here + switch (e.PropertyName) + { + case nameof(item.Command): + case nameof(item.SecondaryCommand): + case nameof(item.AllCommands): + case nameof(item.Name): + WeakReferenceMessenger.Default.Send(new(item)); + break; + case nameof(item.Details): + if (ShowDetails && item.HasDetails) + { + WeakReferenceMessenger.Default.Send(new(item.Details)); + } + else + { + WeakReferenceMessenger.Default.Send(); + } + + break; + case nameof(item.TextToSuggest): + TextToSuggest = item.TextToSuggest; + break; + } } private void ClearSelectedItem()