using CapMachine.Core; using CapMachine.Wpf.PrismEvent; using CapMachine.Wpf.Services; using Microsoft.Win32; using Prism.Commands; using Prism.Events; using Prism.Services.Dialogs; using System; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Windows; namespace CapMachine.Wpf.ViewModels { /// /// CAN/CANFD/LIN 配置导入导出弹窗 ViewModel。 /// public class DialogCanLinConfigImExportViewModel : DialogViewModel { /// /// 初始化导入导出弹窗。 /// /// 导入导出服务。 /// 事件聚合器。 public DialogCanLinConfigImExportViewModel( CanLinConfigImExportService canLinConfigImExportService, IEventAggregator eventAggregator) { CanLinConfigImExportService = canLinConfigImExportService; EventAggregator = eventAggregator; Title = "CAN/CANFD/LIN配置导入导出"; ImportModes = new ObservableCollection { new ImportModeOption { Text = "覆盖导入(同名同类型先删除后导入)", Mode = CanLinImportMode.Overwrite }, new ImportModeOption { Text = "增量导入(同名同类型自动重命名)", Mode = CanLinImportMode.IncrementalRename }, }; SelectedImportMode = ImportModes.FirstOrDefault(); } /// /// 导入导出服务。 /// public CanLinConfigImExportService CanLinConfigImExportService { get; } /// /// 事件聚合器。 /// public IEventAggregator EventAggregator { get; } private string _importFilePath = string.Empty; /// /// 导入文件路径。 /// public string ImportFilePath { get { return _importFilePath; } set { _importFilePath = value; RaisePropertyChanged(); } } private ObservableCollection _importModes = new ObservableCollection(); /// /// 导入模式集合。 /// public ObservableCollection ImportModes { get { return _importModes; } set { _importModes = value; RaisePropertyChanged(); } } private ImportModeOption? _selectedImportMode; /// /// 当前选中的导入模式。 /// public ImportModeOption? SelectedImportMode { get { return _selectedImportMode; } set { _selectedImportMode = value; RaisePropertyChanged(); } } private string _resultMessage = string.Empty; /// /// 操作结果消息。 /// public string ResultMessage { get { return _resultMessage; } set { _resultMessage = value; RaisePropertyChanged(); } } private DelegateCommand? _browseImportFileCmd; /// /// 选择导入文件命令。 /// public DelegateCommand BrowseImportFileCmd { get { if (_browseImportFileCmd == null) { _browseImportFileCmd = new DelegateCommand(BrowseImportFile); } return _browseImportFileCmd; } } private DelegateCommand? _importCmd; /// /// 导入命令。 /// public DelegateCommand ImportCmd { get { if (_importCmd == null) { _importCmd = new DelegateCommand(ImportConfig); } return _importCmd; } } private DelegateCommand? _exportCmd; /// /// 导出命令。 /// public DelegateCommand ExportCmd { get { if (_exportCmd == null) { _exportCmd = new DelegateCommand(ExportConfig); } return _exportCmd; } } private DelegateCommand? _closeCmd; /// /// 关闭命令。 /// public DelegateCommand CloseCmd { get { if (_closeCmd == null) { _closeCmd = new DelegateCommand(CloseDialog); } return _closeCmd; } } /// /// 打开文件选择框并选择导入文件。 /// private void BrowseImportFile() { try { var openFileDialog = new OpenFileDialog { Filter = "JSON文件 (*.json)|*.json|所有文件 (*.*)|*.*", CheckFileExists = true, CheckPathExists = true, }; var ok = openFileDialog.ShowDialog(); if (ok == true) { ImportFilePath = openFileDialog.FileName; } } catch (Exception ex) { MessageBox.Show($"选择导入文件失败:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 执行配置导入。 /// private void ImportConfig() { try { if (string.IsNullOrWhiteSpace(ImportFilePath)) { MessageBox.Show("请先选择导入文件", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); return; } if (SelectedImportMode == null) { MessageBox.Show("请选择导入模式", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var result = CanLinConfigImExportService.ImportFromFile(ImportFilePath, SelectedImportMode.Mode); ResultMessage = BuildResultText(result); if (!result.IsSuccess) { MessageBox.Show(ResultMessage, "导入失败", MessageBoxButton.OK, MessageBoxImage.Error); return; } EventAggregator.GetEvent().Publish("import"); EventAggregator.GetEvent().Publish("import"); MessageBox.Show(ResultMessage, "导入成功", MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { ResultMessage = $"导入失败:{ex.Message}"; MessageBox.Show(ResultMessage, "导入失败", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 执行配置导出。 /// private void ExportConfig() { try { var saveFileDialog = new SaveFileDialog { Filter = "JSON文件 (*.json)|*.json|所有文件 (*.*)|*.*", DefaultExt = "json", FileName = $"CanLinConfigExport_{DateTime.Now:yyyyMMddHHmmss}.json", }; var ok = saveFileDialog.ShowDialog(); if (ok != true) { return; } var result = CanLinConfigImExportService.ExportToFile(saveFileDialog.FileName); ResultMessage = BuildResultText(result); if (!result.IsSuccess) { MessageBox.Show(ResultMessage, "导出失败", MessageBoxButton.OK, MessageBoxImage.Error); return; } MessageBox.Show(ResultMessage, "导出成功", MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { ResultMessage = $"导出失败:{ex.Message}"; MessageBox.Show(ResultMessage, "导出失败", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 关闭弹窗。 /// private void CloseDialog() { RaiseRequestClose(new DialogResult(ButtonResult.Cancel)); } /// /// 构建结果文本。 /// /// 执行结果。 /// 显示文本。 private static string BuildResultText(CanLinConfigImExportResult result) { var builder = new StringBuilder(); builder.AppendLine(result.Message); if (result.RenamedConfigs != null && result.RenamedConfigs.Count > 0) { builder.AppendLine("重命名明细:"); foreach (var line in result.RenamedConfigs) { builder.AppendLine($"- {line}"); } } return builder.ToString(); } /// /// 弹窗打开回调。 /// /// 弹窗参数。 public override void OnDialogOpened(IDialogParameters parameters) { ResultMessage = string.Empty; } /// /// 导入模式选项。 /// public class ImportModeOption { /// /// 文本。 /// public string Text { get; set; } = string.Empty; /// /// 模式值。 /// public CanLinImportMode Mode { get; set; } } } }