using System.Collections.ObjectModel; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using SSPCTester.Devices.Interfaces; using SSPCTester.Logic.Models; using SSPCTester.UI.Services; namespace SSPCTester.UI.ViewModels; /// 保护功能页 VM。 public partial class ProtectViewModel : ObservableObject { private readonly IPowerSupply _power; private readonly UiLogSink _log; private TestSessionViewModel? _session; public ObservableCollection Rows { get; } = new(); [ObservableProperty] private Project? _project; public ProtectViewModel(IPowerSupply power, UiLogSink log) { _power = power; _log = log; } public void SetProject(Project p) { Project = p; ProtectTestPlan.EnsureRows(p); SyncRowsFromProject(); } public void AttachSession(TestSessionViewModel session) { if (_session != null) _session.ProtectResultsChanged -= SyncRowsFromProject; _session = session; _session.ProtectResultsChanged += SyncRowsFromProject; } private void SyncRowsFromProject() { if (Project == null) return; ProtectTestPlan.RefreshMeasuredValues(Project, overwriteExisting: false); Rows.Clear(); foreach (var row in Project.ProtectResults) Rows.Add(row); } [RelayCommand] private async Task MeasurePowerAsync(ProtectRow? row) { if (row == null || !row.CanMeasureFromPower) return; try { var (volts, amps) = await _power.ReadAsync(); row.MeasuredValue = row.ProtectType switch { "过压" or "欠压" => $"{volts:F3} V", _ => $"{amps:F3} A" }; if (row.Status is TestStatus.Untested or TestStatus.Running) row.Status = TestStatus.Measured; _log.Add(UiLogLevel.Success, $"保护功能 {row.ProtectType} 实测值:{row.MeasuredValue}"); } catch (Exception ex) { _log.Add(UiLogLevel.Error, $"读取电源失败:{ex.Message}"); } } }