Files
ADP/SettingModule/ViewModels/SettingViewModel.cs
2026-06-09 15:12:01 +08:00

200 lines
6.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows.Input;
using Prism.Commands;
using Prism.Ioc;
using UIShare.GlobalVariable;
using UIShare.PubEvent;
using UIShare.UIViewModel;
using UIShare.ViewModelBase;
namespace SettingModule.ViewModels
{
public class SettingViewModel : NavigateViewModelBase, IRegionMemberLifetime, IDisposable
{
#region
public bool KeepAlive => true;
public string TestStatus
{
get => _testStatus;
set => SetProperty(ref _testStatus, value);
}
public DeviceInfoModel? SelectedDevice
{
get => _selectedDevice;
set
{
if (SetProperty(ref _selectedDevice, value))
{
OnSelectedDeviceChanged();
}
}
}
public ObservableCollection<DeviceInfoModel> DeviceList
{
get => _deviceList;
set => SetProperty(ref _deviceList, value);
}
public string StatusMessage
{
get => _statusMessage;
set => SetProperty(ref _statusMessage, value);
}
public ObservableCollection<string> ConnectionTypes { get; } = new()
{
"None", "Tcp", "Serial"
};
#endregion
#region
public ICommand RefreshCommand { get; }
public ICommand SaveCommand { get; }
public ICommand ResetCommand { get; }
public ICommand OpenConnectionConfigCommand { get; }
#endregion
#region
private IScopedProvider _scope;
private SystemConfig _systemConfig;
private ScopedContext _scopedContext { get; set; }
private GlobalInfo _globalInfo { get; }
private bool IsInitiated = false;
private string _testStatus = string.Empty;
private DeviceInfoModel? _selectedDevice;
private ObservableCollection<DeviceInfoModel> _deviceList;
private string _statusMessage = "请在左侧选择设备查看 / 编辑配置";
#endregion
public SettingViewModel(IContainerExtension container) : base(container)
{
_globalInfo = container.Resolve<GlobalInfo>();
RefreshCommand = new DelegateCommand(OnExpand);
SaveCommand = new DelegateCommand(OnSave);
ResetCommand = new DelegateCommand(OnReset);
OpenConnectionConfigCommand = new DelegateCommand(OnOpenConnectionConfig);
}
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;
_globalInfo.CurrentScope = TestStatus;
_eventAggregator.GetEvent<ExpandViewEvent>().Publish(TestStatus);
}
/// <summary>保存当前 SystemConfig 到 SystemPath 下,文件名为 {Title}.json。</summary>
private void OnSave()
{
if (_systemConfig == null)
{
StatusMessage = "无可保存的配置";
return;
}
if (string.IsNullOrWhiteSpace(_systemConfig.Title))
{
StatusMessage = "保存失败标题Title不能为空";
return;
}
ConfigService.Save(_systemConfig);
StatusMessage = $"已保存配置 [{_systemConfig.Title}.json] 至 {_systemConfig.SystemPath}{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 },
{ "SystemConfig", _systemConfig }
};
_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 (!IsInitiated && navigationContext.Parameters.ContainsKey("Name"))
{
TestStatus = navigationContext.Parameters.GetValue<string>("Name");
_scope = _globalInfo.ScopeDic[TestStatus];
_scopedContext = _globalInfo.ContextDic[TestStatus];
_systemConfig = _scope.Resolve<SystemConfig>();
if (DeviceList != null && DeviceList.Count > 0)
{
SelectedDevice = DeviceList[0];
}
DeviceList = _systemConfig.DeviceList;
IsInitiated = true;
}
}
#endregion
}
}