From 6daca3eaf6412d488e7e8a854878356d355557e0 Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Tue, 7 Oct 2025 19:04:30 +0800 Subject: [PATCH] =?UTF-8?q?=20feat(mqtt):=20=E5=AE=9E=E7=8E=B0MQTT?= =?UTF-8?q?=E5=88=AB=E5=90=8D=E6=89=B9=E9=87=8F=E4=BF=AE=E6=94=B9=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主要改动: - 在 MqttServerDetailView 中,允许用户在关联变量列表中进行多项选择。 - 修改了 ModifyAlias 命令,使其能够处理多个选中项,并调用批量编辑对话框。 - 新增了 MqttAliasBatchEditDialogViewModel 的构造函数,使其可以接收并编辑已存在的别名列表。 - 通过 SelectedItemsBehavior 辅助类,实现了 DataGrid 中 SelectedItems 的双向绑定。 - 更新了相关视图和视图模型,以支持新的批量操作流程。 --- .../MqttAliasBatchEditDialogViewModel.cs | 32 +- .../ViewModels/MqttServerDetailViewModel.cs | 76 ++- .../Dialogs/MqttAliasBatchEditDialog.xaml | 2 +- DMS.WPF/Views/MqttServerDetailView.xaml | 574 +++++++++++------- 4 files changed, 441 insertions(+), 243 deletions(-) diff --git a/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs index 150fdd8..631e20e 100644 --- a/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs @@ -16,25 +16,41 @@ namespace DMS.WPF.ViewModels.Dialogs public partial class MqttAliasBatchEditDialogViewModel : DialogViewModelBase> { [ObservableProperty] - private ObservableCollection _variableMqttAliases = new(); + private ObservableCollection _currentMqttAliases = new(); [ObservableProperty] private MqttServerItem _selectedMqttServer; public MqttAliasBatchEditDialogViewModel( - List variables, + List variables, MqttServerItem mqttServer) { _selectedMqttServer = mqttServer; - InitializeVariableMqttAliases(variables); + InitializeCurrentMqttAliases(variables); + } + + public MqttAliasBatchEditDialogViewModel(List mqttAliasItems) + { + foreach (var item in mqttAliasItems) + { + MqttAliasItem aliasItem = new MqttAliasItem(); + aliasItem.Id = item.Id; + aliasItem.Alias = item.Alias; + aliasItem.VariableId = item.VariableId; + aliasItem.MqttServerId = item.MqttServerId; + aliasItem.Variable = item.Variable; + aliasItem.MqttServerName = item.MqttServerName; + aliasItem.MqttServer = item.MqttServer; + CurrentMqttAliases.Add(aliasItem); + } } /// /// 初始化变量MQTT别名列表 /// - private void InitializeVariableMqttAliases(List variables) + private void InitializeCurrentMqttAliases(List variables) { - VariableMqttAliases.Clear(); + CurrentMqttAliases.Clear(); foreach (var variable in variables) { @@ -51,7 +67,7 @@ namespace DMS.WPF.ViewModels.Dialogs Alias = existingAlias?.Alias ?? GenerateDefaultAlias(variable) }; - VariableMqttAliases.Add(variableMqttAlias); + CurrentMqttAliases.Add(variableMqttAlias); } } @@ -70,7 +86,7 @@ namespace DMS.WPF.ViewModels.Dialogs [RelayCommand] private void Confirm() { - var result = VariableMqttAliases.ToList(); + var result = CurrentMqttAliases.ToList(); Close(result); } @@ -92,7 +108,7 @@ namespace DMS.WPF.ViewModels.Dialogs if (string.IsNullOrWhiteSpace(prefix)) return; - foreach (var alias in VariableMqttAliases) + foreach (var alias in CurrentMqttAliases) { alias.Alias = $"{prefix}_{alias.Variable.Name}"; } diff --git a/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs b/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs index e0e5260..ff3c386 100644 --- a/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs +++ b/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs @@ -5,9 +5,10 @@ using DMS.Application.Interfaces; using DMS.Application.Interfaces.Management; using DMS.Core.Models; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Dialogs; using DMS.WPF.ItemViewModel; +using DMS.WPF.ViewModels.Dialogs; using Microsoft.Extensions.Logging; +using System.Collections; using System.Collections.ObjectModel; namespace DMS.WPF.ViewModels @@ -39,6 +40,9 @@ namespace DMS.WPF.ViewModels [ObservableProperty] private ObservableCollection _associatedVariables; + [ObservableProperty] + private IList _selectedMqttAliaes = new ArrayList(); + /// /// 构造函数。 @@ -198,9 +202,9 @@ namespace DMS.WPF.ViewModels /// 修改变量的MQTT发送名称 /// [RelayCommand] - private async Task ModifyAlias(MqttAlias variableAlias) + private async Task ModifyAlias() { - if (variableAlias == null) + if (SelectedMqttAliaes.Count == 0) { _notificationService.ShowError("请选择要修改的变量项。"); return; @@ -208,38 +212,52 @@ namespace DMS.WPF.ViewModels try { + List selectedMqttAliaes = SelectedMqttAliaes.Cast().ToList(); // 创建一个用于输入新名称的简单对话框 - var oldAlias = variableAlias.Alias; - InputDialogViewModel viewModel = new InputDialogViewModel("修改发送名称", "请输入新的MQTT发送名称:", oldAlias); - var dialogResult = await _dialogService.ShowDialogAsync(viewModel); - - if (dialogResult != null) // 用户没有取消操作 + + MqttAliasBatchEditDialogViewModel viewModel = new MqttAliasBatchEditDialogViewModel(selectedMqttAliaes); + var resMqttAliaes = await _dialogService.ShowDialogAsync(viewModel); + + if (resMqttAliaes is null) // 用户没有取消操作 { - var newAlias = dialogResult.Trim(); - - if (string.IsNullOrEmpty(newAlias)) + return; + } + foreach (var item in resMqttAliaes) + { + foreach (var selectItem in selectedMqttAliaes) { - _notificationService.ShowWarn("发送名称不能为空。"); - return; + if (item.Id == selectItem.Id) + { + selectItem.Alias = item.Alias; + } } - // 更新变量的发送名称 - variableAlias.Alias = newAlias; - - // 保存更改到数据服务 - // var result = await _wpfDataService.UpdateMqttServer(CurrentMqtt); - // - // if (result) - // { - // _notificationService.ShowSuccess($"变量 '{variableAlias.Variable.Name}' 的发送名称已更新为 '{newAlias}'"); - // } - // else - // { - // _notificationService.ShowError("更新发送名称失败。"); - // // 如果更新失败,恢复原来的值 - // variableAlias.Alias = oldAlias; - // } } + + //var newAlias = dialogResult.Trim(); + + //if (string.IsNullOrEmpty(newAlias)) + //{ + // _notificationService.ShowWarn("发送名称不能为空。"); + // return; + //} + + //// 更新变量的发送名称 + //variableAlias.Alias = newAlias; + + // 保存更改到数据服务 + // var result = await _wpfDataService.UpdateMqttServer(CurrentMqtt); + // + // if (result) + // { + // _notificationService.ShowSuccess($"变量 '{variableAlias.Variable.Name}' 的发送名称已更新为 '{newAlias}'"); + // } + // else + // { + // _notificationService.ShowError("更新发送名称失败。"); + // // 如果更新失败,恢复原来的值 + // variableAlias.Alias = oldAlias; + // } } catch (Exception e) { diff --git a/DMS.WPF/Views/Dialogs/MqttAliasBatchEditDialog.xaml b/DMS.WPF/Views/Dialogs/MqttAliasBatchEditDialog.xaml index 1ab2a4b..b9290ec 100644 --- a/DMS.WPF/Views/Dialogs/MqttAliasBatchEditDialog.xaml +++ b/DMS.WPF/Views/Dialogs/MqttAliasBatchEditDialog.xaml @@ -39,7 +39,7 @@ + - + - + - - + + - - + + - - - - - - - - + + + + + - + - + - + - - + + - + - + - - + + - - + + - + - - - - + + + + - - - - - - - + + + + + + + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - - - - + + + + - - - - - + + + + + - - - - - + + + + + - + - - + + - + - + - - + + - - + + + + + + + + - + - - - - - - - - + + + + + + + +