diff --git a/src/modules/cmdpal/Microsoft.CmdPal.Core.ViewModels/ExtensionObjectViewModel.cs b/src/modules/cmdpal/Microsoft.CmdPal.Core.ViewModels/ExtensionObjectViewModel.cs index f0bb9de118..1c056c4806 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.Core.ViewModels/ExtensionObjectViewModel.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.Core.ViewModels/ExtensionObjectViewModel.cs @@ -51,6 +51,36 @@ public abstract partial class ExtensionObjectViewModel : ObservableObject DoOnUiThread(() => OnPropertyChanged(propertyName)); } + protected void UpdateProperty(string propertyName1, string propertyName2) + { + DoOnUiThread(() => + { + OnPropertyChanged(propertyName1); + OnPropertyChanged(propertyName2); + }); + } + + protected void UpdateProperty(string propertyName1, string propertyName2, string propertyName3) + { + DoOnUiThread(() => + { + OnPropertyChanged(propertyName1); + OnPropertyChanged(propertyName2); + OnPropertyChanged(propertyName3); + }); + } + + protected void UpdateProperty(params string[] propertyNames) + { + DoOnUiThread(() => + { + foreach (var propertyName in propertyNames) + { + OnPropertyChanged(propertyName); + } + }); + } + protected void ShowException(Exception ex, string? extensionHint = null) { if (PageContext.TryGetTarget(out var pageContext)) diff --git a/src/modules/cmdpal/Microsoft.CmdPal.Core.ViewModels/FiltersViewModel.cs b/src/modules/cmdpal/Microsoft.CmdPal.Core.ViewModels/FiltersViewModel.cs index 511581558c..191b0a5ec5 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.Core.ViewModels/FiltersViewModel.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.Core.ViewModels/FiltersViewModel.cs @@ -2,7 +2,6 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using CommunityToolkit.Mvvm.ComponentModel; using Microsoft.CmdPal.Core.ViewModels.Models; using Microsoft.CommandPalette.Extensions; @@ -10,14 +9,11 @@ namespace Microsoft.CmdPal.Core.ViewModels; public partial class FiltersViewModel : ExtensionObjectViewModel { - private readonly ExtensionObject _filtersModel = new(null); + private readonly ExtensionObject _filtersModel; - [ObservableProperty] - public partial string CurrentFilterId { get; set; } = string.Empty; + public string CurrentFilterId { get; private set; } = string.Empty; - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(ShouldShowFilters))] - public partial IFilterItemViewModel[] Filters { get; set; } = []; + public IFilterItemViewModel[] Filters { get; private set; } = []; public bool ShouldShowFilters => Filters.Length > 0; @@ -34,23 +30,11 @@ public partial class FiltersViewModel : ExtensionObjectViewModel if (_filtersModel.Unsafe is not null) { var filters = _filtersModel.Unsafe.GetFilters(); - Filters = filters.Select(filter => - { - var filterItem = filter as IFilter; - if (filterItem != null) - { - var filterVM = new FilterItemViewModel(filterItem!, PageContext); - filterVM.InitializeProperties(); + Filters = BuildFilters(filters ?? []); + UpdateProperty(nameof(Filters), nameof(ShouldShowFilters)); - return filterVM; - } - else - { - return new SeparatorViewModel(); - } - }).ToArray(); - - CurrentFilterId = _filtersModel.Unsafe.CurrentFilterId; + CurrentFilterId = _filtersModel.Unsafe.CurrentFilterId ?? string.Empty; + UpdateProperty(nameof(CurrentFilterId)); return; } @@ -61,7 +45,27 @@ public partial class FiltersViewModel : ExtensionObjectViewModel } Filters = []; + UpdateProperty(nameof(Filters), nameof(ShouldShowFilters)); + CurrentFilterId = string.Empty; + UpdateProperty(nameof(CurrentFilterId)); + } + + private IFilterItemViewModel[] BuildFilters(IFilterItem[] filters) + { + return [..filters.Select(filter => + { + if (filter is IFilter filterItem) + { + var filterItemViewModel = new FilterItemViewModel(filterItem!, PageContext); + filterItemViewModel.InitializeProperties(); + return filterItemViewModel; + } + else + { + return new SeparatorViewModel(); + } + })]; } public override void SafeCleanup() @@ -70,9 +74,9 @@ public partial class FiltersViewModel : ExtensionObjectViewModel foreach (var filter in Filters) { - if (filter is FilterItemViewModel filterVM) + if (filter is FilterItemViewModel filterItemViewModel) { - filterVM.SafeCleanup(); + filterItemViewModel.SafeCleanup(); } } diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/FiltersDropDown.xaml b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/FiltersDropDown.xaml index dec0920235..ee05ea61e8 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/FiltersDropDown.xaml +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI/Controls/FiltersDropDown.xaml @@ -74,6 +74,8 @@ ItemsSource="{x:Bind ViewModel.Filters, Mode=OneWay}" PlaceholderText="Filters" PreviewKeyDown="FiltersComboBox_PreviewKeyDown" + SelectedValue="{x:Bind ViewModel.CurrentFilterId, Mode=OneWay}" + SelectedValuePath="Id" SelectionChanged="FiltersComboBox_SelectionChanged" Style="{StaticResource ComboBoxStyle}" Visibility="{x:Bind ViewModel.ShouldShowFilters, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}">