Files
ADP/SettingModule/ViewModels/SettingViewModel.cs
2026-06-05 13:34:13 +08:00

185 lines
6.1 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.ObjectModel;
using System.Windows.Input;
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;
private string _testStatus = string.Empty;
public string TestStatus
{
get => _testStatus;
set => SetProperty(ref _testStatus, value);
}
private DeviceInfoModel? _selectedDevice;
public DeviceInfoModel? SelectedDevice
{
get => _selectedDevice;
set
{
if (SetProperty(ref _selectedDevice, value))
{
OnSelectedDeviceChanged();
}
}
}
private ObservableCollection<DeviceInfoModel> _deviceList;
public ObservableCollection<DeviceInfoModel> DeviceList
{
get { return _deviceList; }
set { SetProperty(ref _deviceList,value); }
}
private string _statusMessage = "请在左侧选择设备查看 / 编辑配置";
public string StatusMessage
{
get => _statusMessage;
set => SetProperty(ref _statusMessage, value);
}
#endregion
#region
private readonly IScopedProvider _scope;
private readonly SystemConfig _systemConfig;
private ScopedContext _scopedContext { get; }
private GlobalInfo GlobalInfoRef { get; }
#endregion
#region
public ICommand RefreshCommand { get; }
public ICommand SaveCommand { get; }
public ICommand ResetCommand { get; }
public ICommand OpenConnectionConfigCommand { get; }
#endregion
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
}
}