205 lines
7.3 KiB
C#
205 lines
7.3 KiB
C#
using System;
|
||
using System.Collections.ObjectModel;
|
||
using System.Windows.Input;
|
||
using UIShare.GlobalVariable;
|
||
using UIShare.PubEvent;
|
||
using UIShare.UIViewModel;
|
||
using UIShare.ViewModelBase;
|
||
namespace SettingModule.ViewModels
|
||
{
|
||
/// <summary>
|
||
/// 设置界面 VM —— 复用与 RecordView/MonitorView 相同的范式:
|
||
/// - ScopedContext 隔离(每工位独立一份)
|
||
/// - 双击展开(ExpandViewEvent + GlobalInfo.CurrentScope)
|
||
/// - OnNavigatedTo 取 Name 参数作为工位标题
|
||
/// 设备数据来源:注入的 SystemConfig.DeviceList(Scoped 注入,每工位一份)。
|
||
/// </summary>
|
||
public class SettingViewModel : NavigateViewModelBase, IRegionMemberLifetime, IDisposable
|
||
{
|
||
#region 私有字段
|
||
private readonly IScopedProvider _scope;
|
||
private readonly SystemConfig _systemConfig;
|
||
#endregion
|
||
|
||
#region 系统参数(暴露给 XAML 绑定)
|
||
/// <summary>
|
||
/// 公开 SystemConfig 实例供 XAML 绑定(Tab 2"系统参数"页用)。
|
||
/// 这是 Scoped 实例,每个工位一份,互不影响。
|
||
/// </summary>
|
||
public SystemConfig SystemConfig => _systemConfig;
|
||
#endregion
|
||
|
||
#region 隔离 / 标题
|
||
public bool KeepAlive => true;
|
||
public ScopedContext _scopedContext { get; }
|
||
// 公开一份 GlobalInfo 供双击展开使用(基类 _globalInfo 是 private)
|
||
public GlobalInfo GlobalInfoRef { get; }
|
||
|
||
private string _testStatus = string.Empty;
|
||
public string TestStatus
|
||
{
|
||
get => _testStatus;
|
||
set => SetProperty(ref _testStatus, value);
|
||
}
|
||
#endregion
|
||
|
||
#region 设备列表 / 选中设备
|
||
/// <summary>左侧设备列表,直接绑定 SystemConfig.DeviceList</summary>
|
||
public ObservableCollection<DeviceInfoModel> DeviceList { get; }
|
||
|
||
private DeviceInfoModel? _selectedDevice;
|
||
public DeviceInfoModel? SelectedDevice
|
||
{
|
||
get => _selectedDevice;
|
||
set
|
||
{
|
||
if (SetProperty(ref _selectedDevice, value))
|
||
{
|
||
OnSelectedDeviceChanged();
|
||
}
|
||
}
|
||
}
|
||
|
||
private string _statusMessage = "请在左侧选择设备查看 / 编辑配置";
|
||
public string StatusMessage
|
||
{
|
||
get => _statusMessage;
|
||
set => SetProperty(ref _statusMessage, value);
|
||
}
|
||
#endregion
|
||
|
||
#region 命令
|
||
// 双击展开 / 折叠九宫格(与 MonitorView/RecordView 共用同一套 ExpandViewEvent)
|
||
public ICommand RefreshCommand { get; }
|
||
public ICommand SaveCommand { get; }
|
||
public ICommand ResetCommand { get; }
|
||
/// <summary>打开当前选中设备的连接配置对话框(按 ConnectionType 选择 TCP / 串口)。</summary>
|
||
public ICommand OpenConnectionConfigCommand { get; }
|
||
#endregion
|
||
|
||
/// <summary>支持的连接方式列表,供"连接方式"ComboBox 使用。</summary>
|
||
public ObservableCollection<string> ConnectionTypes { get; } = new()
|
||
{
|
||
"None", "TCP", "Serial"
|
||
};
|
||
|
||
public SettingViewModel(IContainerExtension container) : base(container)
|
||
{
|
||
_scope = container.CreateScope();
|
||
GlobalInfoRef = container.Resolve<GlobalInfo>();
|
||
_scopedContext = _scope.Resolve<ScopedContext>();
|
||
_systemConfig = _scope.Resolve<SystemConfig>();
|
||
|
||
// 直接复用 SystemConfig 的 DeviceList,外部修改可同步反映
|
||
DeviceList = _systemConfig.DeviceList;
|
||
|
||
RefreshCommand = new DelegateCommand(OnExpand);
|
||
SaveCommand = new DelegateCommand(OnSave);
|
||
ResetCommand = new DelegateCommand(OnReset);
|
||
OpenConnectionConfigCommand = new DelegateCommand(OnOpenConnectionConfig);
|
||
|
||
// 进来默认选中第一个,让右侧不为空
|
||
if (DeviceList.Count > 0)
|
||
{
|
||
SelectedDevice = DeviceList[0];
|
||
}
|
||
}
|
||
|
||
public void Dispose()
|
||
{
|
||
_scope?.Dispose();
|
||
}
|
||
|
||
#region 命令处理
|
||
/// <summary>
|
||
/// 选中设备切换:右侧配置面板靠 SelectedDevice 绑定自动刷新,
|
||
/// 这里只负责更新状态栏提示。
|
||
/// </summary>
|
||
private void OnSelectedDeviceChanged()
|
||
{
|
||
if (SelectedDevice == null)
|
||
{
|
||
StatusMessage = "未选中设备";
|
||
return;
|
||
}
|
||
StatusMessage = $"当前配置:{SelectedDevice.DeviceName}({SelectedDevice.DeviceType})";
|
||
}
|
||
|
||
/// <summary>双击展开 / 折叠九宫格。</summary>
|
||
private void OnExpand()
|
||
{
|
||
if (string.IsNullOrEmpty(TestStatus)) return;
|
||
_eventAggregator.GetEvent<ExpandViewEvent>().Publish(TestStatus);
|
||
GlobalInfoRef.CurrentScope = TestStatus;
|
||
}
|
||
|
||
/// <summary>保存当前选中设备的配置(占位,实际写盘逻辑后续接入)。</summary>
|
||
private void OnSave()
|
||
{
|
||
if (SelectedDevice == null)
|
||
{
|
||
StatusMessage = "无可保存的设备";
|
||
return;
|
||
}
|
||
StatusMessage = $"已保存设备 [{SelectedDevice.DeviceName}] 的配置({DateTime.Now:HH:mm:ss})";
|
||
}
|
||
|
||
/// <summary>重置当前选中设备的配置(占位)。</summary>
|
||
private void OnReset()
|
||
{
|
||
if (SelectedDevice == null)
|
||
{
|
||
StatusMessage = "无可重置的设备";
|
||
return;
|
||
}
|
||
StatusMessage = $"已重置设备 [{SelectedDevice.DeviceName}] 的配置";
|
||
}
|
||
|
||
/// <summary>
|
||
/// 打开"连接配置"对话框。按 SelectedDevice.ConnectionType 决定开 TCP 还是串口对话框。
|
||
/// </summary>
|
||
private void OnOpenConnectionConfig()
|
||
{
|
||
if (SelectedDevice == null)
|
||
{
|
||
StatusMessage = "请先在左侧选择设备";
|
||
return;
|
||
}
|
||
|
||
var dialogName = SelectedDevice.ConnectionType switch
|
||
{
|
||
"TCP" => "TCPConfig",
|
||
"Serial" => "SerialPortConfig",
|
||
_ => string.Empty
|
||
};
|
||
|
||
if (string.IsNullOrEmpty(dialogName))
|
||
{
|
||
StatusMessage = "当前设备未配置连接方式(请先选择 TCP 或 Serial)";
|
||
return;
|
||
}
|
||
|
||
var p = new DialogParameters { { "Device", SelectedDevice } };
|
||
_dialogService.ShowDialog(dialogName, p, r =>
|
||
{
|
||
if (r.Result == ButtonResult.OK)
|
||
{
|
||
StatusMessage = $"已更新 [{SelectedDevice.DeviceName}] 的连接参数({DateTime.Now:HH:mm:ss})";
|
||
}
|
||
});
|
||
}
|
||
#endregion
|
||
|
||
#region 导航
|
||
public override void OnNavigatedTo(NavigationContext navigationContext)
|
||
{
|
||
base.OnNavigatedTo(navigationContext);
|
||
if (navigationContext.Parameters.ContainsKey("Name"))
|
||
{
|
||
TestStatus = navigationContext.Parameters.GetValue<string>("Name");
|
||
}
|
||
}
|
||
#endregion
|
||
}
|
||
}
|