作用域配置

This commit is contained in:
czj
2026-06-05 14:29:22 +08:00
parent 347f292e9b
commit bb4fe61ded
5 changed files with 131 additions and 127 deletions

View File

@@ -21,15 +21,53 @@ namespace MonitorModule.ViewModels
/// </summary>
public class MonitorViewModel : NavigateViewModelBase, IRegionMemberLifetime, IDisposable
{
#region
public bool KeepAlive => true;
public ScopedContext _scopedContext { get; set; }
public GlobalInfo _globalInfo { get; set; }
public string TestStatus
{
get => _testStatus;
set => SetProperty(ref _testStatus, value);
}
/// <summary>PlotView 直接绑这个 PlotModel</summary>
public PlotModel Plot { get; }
/// <summary>当前已添加的信号集合(左侧列表展示)</summary>
public ObservableCollection<SignalItem> Signals { get; } = new();
public SignalItem? SelectedSignal
{
get => _selectedSignal;
set => SetProperty(ref _selectedSignal, value);
}
public string StatusMessage
{
get => _statusMessage;
set => SetProperty(ref _statusMessage, value);
}
#endregion
#region
public ICommand AddSignalCommand { get; }
public ICommand DeleteSignalCommand { get; }
public ICommand ResetViewCommand { get; }
public ICommand RefreshDataCommand { get; }
// 双击展开/折叠:与 RecordView/AutomatedTestingView 共用同一套 ExpandViewEvent
public ICommand RefreshCommand { get; }
#endregion
#region
private readonly IScopedProvider _scope;
private bool IsInitiated = false;
private IScopedProvider _scope;
// 颜色轮转池,给新加的信号自动分配区分色
private static readonly OxyColor[] _palette =
{
OxyColors.SteelBlue, OxyColors.IndianRed, OxyColors.SeaGreen,
OxyColors.DarkOrange, OxyColors.MediumPurple, OxyColors.Goldenrod,
OxyColors.Teal, OxyColors.Crimson, OxyColors.OliveDrab
};
OxyColors.SteelBlue, OxyColors.IndianRed, OxyColors.SeaGreen,
OxyColors.DarkOrange, OxyColors.MediumPurple, OxyColors.Goldenrod,
OxyColors.Teal, OxyColors.Crimson, OxyColors.OliveDrab
};
private int _signalCounter;
// ===== 模拟数据相关 =====
@@ -43,60 +81,15 @@ namespace MonitorModule.ViewModels
private const int _maxPoints = 200;
// 用于 random walk 的随机源
private static readonly Random _rng = new();
#endregion
#region /
public bool KeepAlive => true;
public ScopedContext _scopedContext { get; }
public GlobalInfo GlobalInfoRef { get; }
private string _testStatus = string.Empty;
public string TestStatus
{
get => _testStatus;
set => SetProperty(ref _testStatus, value);
}
#endregion
#region OxyPlot
/// <summary>PlotView 直接绑这个 PlotModel</summary>
public PlotModel Plot { get; }
/// <summary>当前已添加的信号集合(左侧列表展示)</summary>
public ObservableCollection<SignalItem> Signals { get; } = new();
private SignalItem? _selectedSignal;
public SignalItem? SelectedSignal
{
get => _selectedSignal;
set => SetProperty(ref _selectedSignal, value);
}
private string _statusMessage = "图表已就绪,暂无信号";
public string StatusMessage
{
get => _statusMessage;
set => SetProperty(ref _statusMessage, value);
}
#endregion
#region
public ICommand AddSignalCommand { get; }
public ICommand DeleteSignalCommand { get; }
public ICommand ResetViewCommand { get; }
public ICommand RefreshDataCommand { get; }
// 双击展开/折叠:与 RecordView/AutomatedTestingView 共用同一套 ExpandViewEvent
public ICommand RefreshCommand { get; }
#endregion
public MonitorViewModel(IContainerExtension container) : base(container)
{
_scope = container.CreateScope();
GlobalInfoRef = container.Resolve<GlobalInfo>();
_scopedContext = _scope.Resolve<ScopedContext>();
_globalInfo = container.Resolve<GlobalInfo>();
Plot = BuildEmptyPlot();
AddSignalCommand = new DelegateCommand(OnAddSignal);
DeleteSignalCommand = new DelegateCommand(OnDeleteSignal);
ResetViewCommand = new DelegateCommand(OnResetView);
@@ -257,8 +250,9 @@ namespace MonitorModule.ViewModels
private void OnExpand()
{
if (string.IsNullOrEmpty(TestStatus)) return;
_globalInfo.CurrentScope = TestStatus;
_eventAggregator.GetEvent<ExpandViewEvent>().Publish(TestStatus);
GlobalInfoRef.CurrentScope = TestStatus;
}
/// <summary>
@@ -297,15 +291,18 @@ namespace MonitorModule.ViewModels
}
#endregion
#region
#region
public override void OnNavigatedTo(NavigationContext navigationContext)
{
base.OnNavigatedTo(navigationContext);
if (navigationContext.Parameters.ContainsKey("Name"))
if (!IsInitiated && navigationContext.Parameters.ContainsKey("Name"))
{
TestStatus = navigationContext.Parameters.GetValue<string>("Name");
Plot.Title = $"监控 - {TestStatus}";
Plot.InvalidatePlot(false);
_scope = _globalInfo.ScopeDic[TestStatus];
_scopedContext = _globalInfo.ContextDic[TestStatus];
IsInitiated = true;
}
}
#endregion

View File

@@ -18,40 +18,24 @@ namespace MonitorModule.ViewModels
/// </summary>
public class RecordViewModel : NavigateViewModelBase, IRegionMemberLifetime, IDisposable
{
#region
// 数据库相对路径:运行目录\SQL\ADP.db数据库未就绪时容错处理不抛异常
private static readonly string DbFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SQL");
private static readonly string DbPath = Path.Combine(DbFolder, "ADP.db");
private static readonly string ConnStr = $"Data Source={DbPath};Version=3;";
private readonly IScopedProvider _scope;
#endregion
#region ScopedContext
#region
public bool KeepAlive => true;
public ScopedContext _scopedContext { get; }
// 公开一份 GlobalInfo 供双击展开逻辑使用(基类的 _globalInfo 是 private
public GlobalInfo GlobalInfoRef { get; }
#endregion
public ScopedContext _scopedContext { get; set; }
public GlobalInfo _globalInfo { get; }
#region
private string _testStatus = string.Empty;
public string TestStatus
{
get => _testStatus;
set => SetProperty(ref _testStatus, value);
}
#endregion
#region / /
private ObservableCollection<string> _tableNames = new();
public ObservableCollection<string> TableNames
{
get => _tableNames;
set => SetProperty(ref _tableNames, value);
}
private string? _selectedTable;
public string? SelectedTable
{
get => _selectedTable;
@@ -66,37 +50,30 @@ namespace MonitorModule.ViewModels
}
// 用户填写的 WHERE 子句(不带 WHERE 关键字例如Status='OK' AND Id>10
private string _whereClause = string.Empty;
public string WhereClause
{
get => _whereClause;
set => SetProperty(ref _whereClause, value);
}
private DataTable _resultTable = new();
public DataTable ResultTable
{
get => _resultTable;
set => SetProperty(ref _resultTable, value);
}
private string _statusMessage = "未连接";
public string StatusMessage
{
get => _statusMessage;
set => SetProperty(ref _statusMessage, value);
}
#endregion
#region
private int _pageIndex = 1;
public int PageIndex
{
get => _pageIndex;
set => SetProperty(ref _pageIndex, value);
}
private int _pageSize = 50;
public int PageSize
{
get => _pageSize;
@@ -111,7 +88,6 @@ namespace MonitorModule.ViewModels
}
}
private long _totalCount;
public long TotalCount
{
get => _totalCount;
@@ -145,13 +121,27 @@ namespace MonitorModule.ViewModels
// 双击展开/折叠:与 MonitorView/AutomatedTestingView 共用
public ICommand RefreshCommand { get; }
#endregion
#region
// 数据库相对路径:运行目录\SQL\ADP.db数据库未就绪时容错处理不抛异常
private static readonly string DbFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SQL");
private static readonly string DbPath = Path.Combine(DbFolder, "ADP.db");
private static readonly string ConnStr = $"Data Source={DbPath};Version=3;";
private bool IsInitiated = false;
private IScopedProvider _scope;
private string _testStatus = string.Empty;
private ObservableCollection<string> _tableNames = new();
private string? _selectedTable;
private string _whereClause = string.Empty;
private DataTable _resultTable = new();
private string _statusMessage = "未连接";
private int _pageIndex = 1;
private int _pageSize = 50;
private long _totalCount;
#endregion
public RecordViewModel(IContainerExtension container) : base(container)
{
_scope = container.CreateScope();
GlobalInfoRef = container.Resolve<GlobalInfo>();
_scopedContext = _scope.Resolve<ScopedContext>();
_globalInfo = container.Resolve<GlobalInfo>();
LoadedCommand = new DelegateCommand(LoadTables);
RefreshTablesCommand = new DelegateCommand(LoadTables);
QueryCommand = new DelegateCommand(() => { PageIndex = 1; Query(); });
@@ -341,20 +331,23 @@ namespace MonitorModule.ViewModels
private void OnExpand()
{
if (string.IsNullOrEmpty(TestStatus)) return;
_globalInfo.CurrentScope = TestStatus;
_eventAggregator.GetEvent<ExpandViewEvent>().Publish(TestStatus);
GlobalInfoRef.CurrentScope = TestStatus;
}
#endregion
#region
#region
public override void OnNavigatedTo(NavigationContext navigationContext)
{
base.OnNavigatedTo(navigationContext);
if (navigationContext.Parameters.ContainsKey("Name"))
if (!IsInitiated&&navigationContext.Parameters.ContainsKey("Name"))
{
TestStatus = navigationContext.Parameters.GetValue<string>("Name");
_scope = _globalInfo.ScopeDic[TestStatus];
_scopedContext = _globalInfo.ContextDic[TestStatus];
IsInitiated = true;
}
// 进入界面时自动加载表
LoadTables();
}
#endregion