diff --git a/Cardiopulmonarybypasssystems/MainWindow.xaml b/Cardiopulmonarybypasssystems/MainWindow.xaml index 067afeb..e6401bf 100644 --- a/Cardiopulmonarybypasssystems/MainWindow.xaml +++ b/Cardiopulmonarybypasssystems/MainWindow.xaml @@ -116,7 +116,7 @@ - + diff --git a/Cardiopulmonarybypasssystems/ViewModels/MainViewModel.cs b/Cardiopulmonarybypasssystems/ViewModels/MainViewModel.cs index b9414d1..0d28f31 100644 --- a/Cardiopulmonarybypasssystems/ViewModels/MainViewModel.cs +++ b/Cardiopulmonarybypasssystems/ViewModels/MainViewModel.cs @@ -81,6 +81,8 @@ public partial class MainViewModel : ObservableObject [ObservableProperty] private string itemSearchText = ""; + private string activeFilter = "全部"; + public MainViewModel(IStandardRepository repository, IModbusTelemetryService telemetryService) { _telemetryService = telemetryService; @@ -109,7 +111,8 @@ public partial class MainViewModel : ObservableObject public ObservableCollection TraceEvents { get; } public ObservableCollection AlarmMessages { get; } public ObservableCollection ResultStatusOptions { get; } - public IEnumerable FilteredItems => InspectionItems.Where(MatchesItemSearch); + public ObservableCollection ItemFilterOptions { get; } = new(["全部", "待填写", "已完成", "实时监控", "手动填写"]); + public IEnumerable FilteredItems => InspectionItems.Where(MatchesActiveFilter).Where(MatchesItemSearch); public bool HasFilteredItems => FilteredItems.Any(); public IEnumerable FlowSensorChannels => Channels.Where(IsFlowSensorChannel); public IEnumerable OtherChannels => Channels.Where(channel => !IsFlowSensorChannel(channel)); @@ -158,20 +161,18 @@ public partial class MainViewModel : ObservableObject partial void OnDetectionCompletedChanged(bool value) => OnPropertyChanged(nameof(ExportStateText)); partial void OnItemSearchTextChanged(string value) { - OnPropertyChanged(nameof(FilteredItems)); - OnPropertyChanged(nameof(FilteredItemSummary)); - OnPropertyChanged(nameof(HasFilteredItems)); - OnPropertyChanged(nameof(HasItemSearchText)); + RefreshFilteredItemsView(); + } - var filtered = FilteredItems.ToList(); - if (filtered.Count == 0) + public string ActiveFilter + { + get => activeFilter; + set { - return; - } - - if (SelectedItem is null || !filtered.Contains(SelectedItem)) - { - SelectedItem = filtered[0]; + if (SetProperty(ref activeFilter, value)) + { + RefreshFilteredItemsView(); + } } } @@ -305,6 +306,7 @@ public partial class MainViewModel : ObservableObject }); RefreshComputedState(); + RefreshFilteredItemsView(); } [RelayCommand] @@ -388,6 +390,7 @@ public partial class MainViewModel : ObservableObject RefreshTelemetryPanel(); RefreshComputedState(); + RefreshFilteredItemsView(); } private void RefreshTelemetryPanel() @@ -430,6 +433,25 @@ public partial class MainViewModel : ObservableObject ComplianceRate = InspectionItems.Count == 0 ? 0 : QualifiedCount * 100d / InspectionItems.Count; } + private void RefreshFilteredItemsView() + { + OnPropertyChanged(nameof(FilteredItems)); + OnPropertyChanged(nameof(FilteredItemSummary)); + OnPropertyChanged(nameof(HasFilteredItems)); + OnPropertyChanged(nameof(HasItemSearchText)); + + var filtered = FilteredItems.ToList(); + if (filtered.Count == 0) + { + return; + } + + if (SelectedItem is null || !filtered.Contains(SelectedItem)) + { + SelectedItem = filtered[0]; + } + } + private void LoadSelectedItemDraft(InspectionItem item) { ResultValue = SelectedItemUsesRealtimeValue @@ -629,6 +651,15 @@ ul {{ padding-left: 20px; }} || MatchesKeyword(item.TestMethod, keyword); } + private bool MatchesActiveFilter(InspectionItem item) => ActiveFilter switch + { + "待填写" => item.Status == InspectionItemStatus.Pending, + "已完成" => item.Status != InspectionItemStatus.Pending, + "实时监控" => item.CaptureMode == InspectionItemCaptureMode.RealtimeMonitor, + "手动填写" => item.CaptureMode != InspectionItemCaptureMode.RealtimeMonitor, + _ => true + }; + private static bool MatchesKeyword(string source, string keyword) { if (source.Contains(keyword, StringComparison.OrdinalIgnoreCase))