diff --git a/CRSim.Core/Abstractions/IPluginService.cs b/CRSim.Core/Abstractions/IPluginService.cs index 44a2c2a..60296d6 100644 --- a/CRSim.Core/Abstractions/IPluginService.cs +++ b/CRSim.Core/Abstractions/IPluginService.cs @@ -13,16 +13,16 @@ public interface IPluginService /// public static readonly string PluginPackageExtension = ".crsp"; - internal static ObservableCollection LoadedPluginsInternal { get; } = []; + internal static List LoadedPluginsInternal { get; } = []; /// /// 已加载的插件信息列表。 /// - public static ObservableCollection LoadedPlugins => LoadedPluginsInternal; + public static List LoadedPlugins => LoadedPluginsInternal; - internal static ObservableCollection OnlinePluginsInternal { get; } = []; + internal static List OnlinePluginsInternal { get; } = []; - public static ObservableCollection OnlinePlugins => OnlinePluginsInternal; + public static List OnlinePlugins => OnlinePluginsInternal; Task InstallPluginOnlineAsync(PluginInfo plugin); Task InstallPluginLocalAsync(string filePath); diff --git a/CRSim/ViewModels/PluginManagementPageViewModel.cs b/CRSim/ViewModels/PluginManagementPageViewModel.cs index a747dd2..7561694 100644 --- a/CRSim/ViewModels/PluginManagementPageViewModel.cs +++ b/CRSim/ViewModels/PluginManagementPageViewModel.cs @@ -1,7 +1,4 @@ -using CRSim.Core.Abstractions; -using CRSim.Core.Models; -using CRSim.Core.Models.Plugin; -using CRSim.Core.Services; +using CRSim.Core.Models.Plugin; using System.Diagnostics; namespace CRSim.ViewModels; @@ -11,10 +8,20 @@ public partial class PluginManagementPageViewModel : ObservableObject [ObservableProperty] public partial string PageTitle { get; set; } = "插件管理"; + [ObservableProperty] + public partial string SearchText { get; set; } = ""; + [ObservableProperty] public partial PluginInfo? SelectedPlugin { get; set; } - public ObservableCollection Plugins = IPluginService.OnlinePlugins; + public List Plugins = IPluginService.OnlinePlugins; + + public List FilteredPlugins => [.. Plugins.Where(x => x.Manifest.Name.Contains(SearchText) && (SelectedAuthor == "全体作者" || x.Manifest.Author == SelectedAuthor))]; + + public List Authors => ["全体作者",.. Plugins.Select(x => x.Manifest.Author).Distinct()]; + + [ObservableProperty] + public partial string SelectedAuthor { get; set; } = "全体作者"; private readonly IPluginService _pluginService; private readonly IDialogService _dialogService; @@ -23,7 +30,12 @@ public partial class PluginManagementPageViewModel : ObservableObject { _pluginService = pluginService; _dialogService = dialogService; - _pluginService.LoadOnlinePluginsAsync(); + _ = InitAsync(); + } + private async Task InitAsync() + { + await _pluginService.LoadOnlinePluginsAsync(); + OnPropertyChanged(nameof(FilteredPlugins)); } [RelayCommand] @@ -102,7 +114,9 @@ public partial class PluginManagementPageViewModel : ObservableObject { SelectedPlugin = null; Plugins = (selectorBarItem?.Text == "本地") ? IPluginService.OnlinePlugins : IPluginService.LoadedPlugins; - OnPropertyChanged(nameof(Plugins)); + OnPropertyChanged(nameof(Authors)); + SelectedAuthor = "全体作者"; + OnPropertyChanged(nameof(FilteredPlugins)); } } @@ -120,5 +134,14 @@ public partial class PluginManagementPageViewModel : ObservableObject public async Task Refresh() { await _pluginService.LoadOnlinePluginsAsync(); + OnPropertyChanged(nameof(Authors)); + SelectedAuthor = "全体作者"; + OnPropertyChanged(nameof(FilteredPlugins)); + } + + [RelayCommand] + public void Search(object args) + { + OnPropertyChanged(nameof(FilteredPlugins)); } } \ No newline at end of file diff --git a/CRSim/Views/PluginManagementPage.xaml b/CRSim/Views/PluginManagementPage.xaml index e46b57a..33aa336 100644 --- a/CRSim/Views/PluginManagementPage.xaml +++ b/CRSim/Views/PluginManagementPage.xaml @@ -37,10 +37,11 @@ + - + @@ -63,8 +64,30 @@ - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/CRSim/Views/PluginManagementPage.xaml.cs b/CRSim/Views/PluginManagementPage.xaml.cs index 173b39c..52379f2 100644 --- a/CRSim/Views/PluginManagementPage.xaml.cs +++ b/CRSim/Views/PluginManagementPage.xaml.cs @@ -14,6 +14,5 @@ public sealed partial class PluginManagementPage : Page private void SelectorBar_SelectionChanged(SelectorBar sender, SelectorBarSelectionChangedEventArgs args) { - Console.WriteLine($"SelectorBar selection changed"); } } diff --git a/Directory.Build.props b/Directory.Build.props index 77b4476..eabd140 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 2.3.104.0 + 2.3.105.0 电排骨 https://github.com/denglihong2007/CRSim