using System.Collections.ObjectModel; using System.Windows.Input; using UIShare.PubEvent; using UIShare.UIViewModel; using UIShare.ViewModelBase; namespace SettingModule.ViewModels.Dialogs { /// /// TCP 连接配置对话框 VM。 /// 通过 DialogParameters 接收宿主 DeviceInfoVM;保存时把副本写回宿主。 /// public class TCPConfigViewModel : DialogViewModelBase { #region 属性 private string _title = "TCP 连接配置"; public string Title { get => _title; set => SetProperty(ref _title, value); } /// 编辑用的副本,取消时不会污染宿主对象。 private TcpConfigVM _config = new(); public TcpConfigVM Config { get => _config; set => SetProperty(ref _config, value); } /// 常用 Modbus / 自定义协议端口建议。 public ObservableCollection CommonPorts { get; } = new() { 502, 102, 80, 8080, 5020, 4840 }; /// 常用超时(毫秒)。 public ObservableCollection CommonTimeouts { get; } = new() { 500, 1000, 2000, 3000, 5000, 10000 }; private string _errorMessage = string.Empty; public string ErrorMessage { get => _errorMessage; set => SetProperty(ref _errorMessage, value); } #endregion #region 命令 public ICommand SaveCommand { get; } public ICommand CancelCommand { get; } #endregion // 用于保存时把副本回写到原对象 private DeviceInfoVM? _hostDevice; public TCPConfigViewModel(IContainerProvider containerProvider) : base(containerProvider) { SaveCommand = new DelegateCommand(OnSave); CancelCommand = new DelegateCommand(OnCancel); } private bool Validate(out string error) { error = string.Empty; if (string.IsNullOrWhiteSpace(Config.IPAddress)) { error = "IP 地址不能为空"; return false; } if (!System.Net.IPAddress.TryParse(Config.IPAddress, out _)) { error = "IP 地址格式不正确"; return false; } if (Config.Port <= 0 || Config.Port > 65535) { error = "端口范围应在 1 - 65535"; return false; } if (Config.SendTimeout < 0 || Config.ReceiveTimeout < 0) { error = "超时时间不能为负数"; return false; } return true; } private void OnSave() { if (!Validate(out var error)) { ErrorMessage = error; return; } ErrorMessage = string.Empty; // 把副本写回宿主 if (_hostDevice != null) { _hostDevice.TcpConfig ??= new TcpConfigVM(); Config.CopyTo(_hostDevice.TcpConfig); _hostDevice.ConnectionType = "TCP"; } RequestClose.Invoke(ButtonResult.OK); } private void OnCancel() => RequestClose.Invoke(ButtonResult.Cancel); #region Prism Dialog 规范 public override void OnDialogOpened(IDialogParameters parameters) { _eventAggregator.GetEvent().Publish(true); if (parameters.ContainsKey("Device")) { _hostDevice = parameters.GetValue("Device"); Title = $"TCP 连接配置 - {_hostDevice?.DeviceName}"; Config = new TcpConfigVM(_hostDevice?.TcpConfig); } else if (parameters.ContainsKey("Config")) { Config = new TcpConfigVM(parameters.GetValue("Config")); } } public override void OnDialogClosed() { _eventAggregator.GetEvent().Publish(false); } #endregion } }