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

205 lines
7.3 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
{
/// <summary>
/// 设置界面 VM —— 复用与 RecordView/MonitorView 相同的范式:
/// - ScopedContext 隔离(每工位独立一份)
/// - 双击展开ExpandViewEvent + GlobalInfo.CurrentScope
/// - OnNavigatedTo 取 Name 参数作为工位标题
/// 设备数据来源:注入的 SystemConfig.DeviceListScoped 注入,每工位一份)。
/// </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
}
}