feat(mqtt): 实现MQTT别名批量修改功能

主要改动:
  - 在 MqttServerDetailView 中,允许用户在关联变量列表中进行多项选择。
  - 修改了 ModifyAlias 命令,使其能够处理多个选中项,并调用批量编辑对话框。
  - 新增了 MqttAliasBatchEditDialogViewModel 的构造函数,使其可以接收并编辑已存在的别名列表。
  - 通过 SelectedItemsBehavior 辅助类,实现了 DataGrid 中 SelectedItems 的双向绑定。
  - 更新了相关视图和视图模型,以支持新的批量操作流程。
This commit is contained in:
2025-10-07 19:04:30 +08:00
parent b753e5ea73
commit 6daca3eaf6
4 changed files with 441 additions and 243 deletions

View File

@@ -16,7 +16,7 @@ namespace DMS.WPF.ViewModels.Dialogs
public partial class MqttAliasBatchEditDialogViewModel : DialogViewModelBase<List<MqttAliasItem>> public partial class MqttAliasBatchEditDialogViewModel : DialogViewModelBase<List<MqttAliasItem>>
{ {
[ObservableProperty] [ObservableProperty]
private ObservableCollection<MqttAliasItem> _variableMqttAliases = new(); private ObservableCollection<MqttAliasItem> _currentMqttAliases = new();
[ObservableProperty] [ObservableProperty]
private MqttServerItem _selectedMqttServer; private MqttServerItem _selectedMqttServer;
@@ -26,15 +26,31 @@ namespace DMS.WPF.ViewModels.Dialogs
MqttServerItem mqttServer) MqttServerItem mqttServer)
{ {
_selectedMqttServer = mqttServer; _selectedMqttServer = mqttServer;
InitializeVariableMqttAliases(variables); InitializeCurrentMqttAliases(variables);
}
public MqttAliasBatchEditDialogViewModel(List<MqttAliasItem> 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);
}
} }
/// <summary> /// <summary>
/// 初始化变量MQTT别名列表 /// 初始化变量MQTT别名列表
/// </summary> /// </summary>
private void InitializeVariableMqttAliases(List<VariableItem> variables) private void InitializeCurrentMqttAliases(List<VariableItem> variables)
{ {
VariableMqttAliases.Clear(); CurrentMqttAliases.Clear();
foreach (var variable in variables) foreach (var variable in variables)
{ {
@@ -51,7 +67,7 @@ namespace DMS.WPF.ViewModels.Dialogs
Alias = existingAlias?.Alias ?? GenerateDefaultAlias(variable) Alias = existingAlias?.Alias ?? GenerateDefaultAlias(variable)
}; };
VariableMqttAliases.Add(variableMqttAlias); CurrentMqttAliases.Add(variableMqttAlias);
} }
} }
@@ -70,7 +86,7 @@ namespace DMS.WPF.ViewModels.Dialogs
[RelayCommand] [RelayCommand]
private void Confirm() private void Confirm()
{ {
var result = VariableMqttAliases.ToList(); var result = CurrentMqttAliases.ToList();
Close(result); Close(result);
} }
@@ -92,7 +108,7 @@ namespace DMS.WPF.ViewModels.Dialogs
if (string.IsNullOrWhiteSpace(prefix)) if (string.IsNullOrWhiteSpace(prefix))
return; return;
foreach (var alias in VariableMqttAliases) foreach (var alias in CurrentMqttAliases)
{ {
alias.Alias = $"{prefix}_{alias.Variable.Name}"; alias.Alias = $"{prefix}_{alias.Variable.Name}";
} }

View File

@@ -5,9 +5,10 @@ using DMS.Application.Interfaces;
using DMS.Application.Interfaces.Management; using DMS.Application.Interfaces.Management;
using DMS.Core.Models; using DMS.Core.Models;
using DMS.WPF.Interfaces; using DMS.WPF.Interfaces;
using DMS.WPF.ViewModels.Dialogs;
using DMS.WPF.ItemViewModel; using DMS.WPF.ItemViewModel;
using DMS.WPF.ViewModels.Dialogs;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System.Collections;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
namespace DMS.WPF.ViewModels namespace DMS.WPF.ViewModels
@@ -39,6 +40,9 @@ namespace DMS.WPF.ViewModels
[ObservableProperty] [ObservableProperty]
private ObservableCollection<MqttAlias> _associatedVariables; private ObservableCollection<MqttAlias> _associatedVariables;
[ObservableProperty]
private IList _selectedMqttAliaes = new ArrayList();
/// <summary> /// <summary>
/// 构造函数。 /// 构造函数。
@@ -198,9 +202,9 @@ namespace DMS.WPF.ViewModels
/// 修改变量的MQTT发送名称 /// 修改变量的MQTT发送名称
/// </summary> /// </summary>
[RelayCommand] [RelayCommand]
private async Task ModifyAlias(MqttAlias variableAlias) private async Task ModifyAlias()
{ {
if (variableAlias == null) if (SelectedMqttAliaes.Count == 0)
{ {
_notificationService.ShowError("请选择要修改的变量项。"); _notificationService.ShowError("请选择要修改的变量项。");
return; return;
@@ -208,23 +212,38 @@ namespace DMS.WPF.ViewModels
try try
{ {
List<MqttAliasItem> selectedMqttAliaes = SelectedMqttAliaes.Cast<MqttAliasItem>().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);
var newAlias = dialogResult.Trim();
if (string.IsNullOrEmpty(newAlias)) if (resMqttAliaes is null) // 用户没有取消操作
{ {
_notificationService.ShowWarn("发送名称不能为空。");
return; return;
} }
foreach (var item in resMqttAliaes)
{
foreach (var selectItem in selectedMqttAliaes)
{
if (item.Id == selectItem.Id)
{
selectItem.Alias = item.Alias;
}
}
// 更新变量的发送名称 }
variableAlias.Alias = newAlias;
//var newAlias = dialogResult.Trim();
//if (string.IsNullOrEmpty(newAlias))
//{
// _notificationService.ShowWarn("发送名称不能为空。");
// return;
//}
//// 更新变量的发送名称
//variableAlias.Alias = newAlias;
// 保存更改到数据服务 // 保存更改到数据服务
// var result = await _wpfDataService.UpdateMqttServer(CurrentMqtt); // var result = await _wpfDataService.UpdateMqttServer(CurrentMqtt);
@@ -240,7 +259,6 @@ namespace DMS.WPF.ViewModels
// variableAlias.Alias = oldAlias; // variableAlias.Alias = oldAlias;
// } // }
} }
}
catch (Exception e) catch (Exception e)
{ {
_logger.LogError(e, "修改变量发送名称时发生错误"); _logger.LogError(e, "修改变量发送名称时发生错误");

View File

@@ -39,7 +39,7 @@
</StackPanel> </StackPanel>
<DataGrid Grid.Row="2" <DataGrid Grid.Row="2"
ItemsSource="{Binding VariableMqttAliases}" ItemsSource="{Binding CurrentMqttAliases}"
AutoGenerateColumns="False" AutoGenerateColumns="False"
CanUserAddRows="False" CanUserAddRows="False"
CanUserDeleteRows="False" CanUserDeleteRows="False"

View File

@@ -1,31 +1,39 @@
<UserControl x:Class="DMS.WPF.Views.MqttServerDetailView" <UserControl
x:Class="DMS.WPF.Views.MqttServerDetailView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:helper="clr-namespace:DMS.WPF.Helper"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern" xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
xmlns:valueConverts="clr-namespace:DMS.WPF.ValueConverts" xmlns:valueConverts="clr-namespace:DMS.WPF.ValueConverts"
mc:Ignorable="d" d:DesignHeight="450"
d:DesignHeight="450" d:DesignWidth="800"> d:DesignWidth="800"
mc:Ignorable="d">
<UserControl.Resources> <UserControl.Resources>
<valueConverts:EnumDescriptionConverter x:Key="EnumDescriptionConverter"/> <valueConverts:EnumDescriptionConverter x:Key="EnumDescriptionConverter" />
</UserControl.Resources> </UserControl.Resources>
<DockPanel> <DockPanel>
<!-- 顶部导航栏 --> <!-- 顶部导航栏 -->
<Border DockPanel.Dock="Top" Margin="20,10" Padding="15"> <Border
Margin="20,10"
Padding="15"
DockPanel.Dock="Top">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<!-- 返回MQTT列表按钮 --> <!-- 返回MQTT列表按钮 -->
<Button Grid.Column="0" <Button
Grid.Column="0"
Margin="0,0,10,0"
Command="{Binding NavigateToMqttsCommand}" Command="{Binding NavigateToMqttsCommand}"
Style="{StaticResource ButtonDefault}" Style="{StaticResource ButtonDefault}"
ToolTip="返回MQTT服务器列表" ToolTip="返回MQTT服务器列表">
Margin="0,0,10,0">
<Button.Content> <Button.Content>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.ArrowLeft8}" /> <ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.ArrowLeft8}" />
@@ -34,12 +42,16 @@
</Button> </Button>
<!-- 操作菜单栏 --> <!-- 操作菜单栏 -->
<ui:CommandBar Grid.Column="1" <ui:CommandBar
Grid.Column="1"
HorizontalAlignment="Right"
DefaultLabelPosition="Right" DefaultLabelPosition="Right"
IsOpen="False" IsOpen="False">
HorizontalAlignment="Right">
<ui:AppBarButton x:Name="EditButton" Label="编辑" Command="{Binding EditMqttCommand}"> <ui:AppBarButton
x:Name="EditButton"
Command="{Binding EditMqttCommand}"
Label="编辑">
<ui:AppBarButton.Icon> <ui:AppBarButton.Icon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Edit}" /> <ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Edit}" />
</ui:AppBarButton.Icon> </ui:AppBarButton.Icon>
@@ -65,227 +77,379 @@
<ScrollViewer DockPanel.Dock="Top" VerticalScrollBarVisibility="Auto"> <ScrollViewer DockPanel.Dock="Top" VerticalScrollBarVisibility="Auto">
<StackPanel Margin="20"> <StackPanel Margin="20">
<!-- MQTT Server Details --> <!-- MQTT Server Details -->
<Border Background="White" BorderBrush="#E0E0E0" BorderThickness="1" CornerRadius="8" Margin="0,0,0,10" Padding="15"> <Border
Margin="0,0,0,10"
Padding="15"
Background="White"
BorderBrush="#E0E0E0"
BorderThickness="1"
CornerRadius="8">
<Border.Effect> <Border.Effect>
<DropShadowEffect ShadowDepth="2" BlurRadius="5" Opacity="0.1" Color="#888888"/> <DropShadowEffect
BlurRadius="5"
Opacity="0.1"
ShadowDepth="2"
Color="#888888" />
</Border.Effect> </Border.Effect>
<StackPanel> <StackPanel>
<Grid Margin="0,0,0,10"> <Grid Margin="0,0,0,10">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal"> <StackPanel Grid.Column="0" Orientation="Horizontal">
<ui:FontIcon FontFamily="{StaticResource MdFontIcons}" <ui:FontIcon
Glyph="&#xF048B;"
FontSize="24"
VerticalAlignment="Center"
Margin="0,0,10,0" Margin="0,0,10,0"
Foreground="#2196F3"/> VerticalAlignment="Center"
<TextBlock Text="MQTT 服务器详情" FontFamily="{StaticResource MdFontIcons}"
FontSize="24"
Foreground="#2196F3"
Glyph="&#xF048B;" />
<TextBlock
VerticalAlignment="Center"
Style="{StaticResource SubtitleTextBlockStyle}" Style="{StaticResource SubtitleTextBlockStyle}"
VerticalAlignment="Center"/> Text="MQTT 服务器详情" />
</StackPanel> </StackPanel>
</Grid> </Grid>
<Grid Margin="0,8,0,8"> <Grid Margin="0,8,0,8">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal" Margin="0,0,5,12"> <StackPanel
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Tag}" Grid.Row="0"
FontSize="16" Grid.Column="0"
VerticalAlignment="Center" Margin="0,0,5,12"
Orientation="Horizontal">
<ui:FontIcon
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> VerticalAlignment="Center"
<TextBlock Text="名称:" VerticalAlignment="Center"/> FontSize="16"
Foreground="#666666"
Icon="{x:Static ui:SegoeFluentIcons.Tag}" />
<TextBlock VerticalAlignment="Center" Text="名称:" />
</StackPanel> </StackPanel>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding CurrentMqtt.ServerName}" <TextBlock
Margin="0,0,10,12" VerticalAlignment="Center" Grid.Row="0"
FontWeight="SemiBold" Foreground="#333333"/> Grid.Column="1"
Margin="0,0,10,12"
<StackPanel Grid.Row="0" Grid.Column="2" Orientation="Horizontal" Margin="0,0,5,12">
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.World}"
FontSize="16"
VerticalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="#333333"
Text="{Binding CurrentMqtt.ServerName}" />
<StackPanel
Grid.Row="0"
Grid.Column="2"
Margin="0,0,5,12"
Orientation="Horizontal">
<ui:FontIcon
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> VerticalAlignment="Center"
<TextBlock Text="主机:" VerticalAlignment="Center"/> FontSize="16"
Foreground="#666666"
Icon="{x:Static ui:SegoeFluentIcons.World}" />
<TextBlock VerticalAlignment="Center" Text="主机:" />
</StackPanel> </StackPanel>
<TextBlock Grid.Row="0" Grid.Column="3" Text="{Binding CurrentMqtt.ServerUrl}" <TextBlock
Margin="0,0,0,12" VerticalAlignment="Center" Grid.Row="0"
FontWeight="SemiBold" Foreground="#333333"/> Grid.Column="3"
Margin="0,0,0,12"
<StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal" Margin="0,0,5,12">
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.ConnectApp}"
FontSize="16"
VerticalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="#333333"
Text="{Binding CurrentMqtt.ServerUrl}" />
<StackPanel
Grid.Row="1"
Grid.Column="0"
Margin="0,0,5,12"
Orientation="Horizontal">
<ui:FontIcon
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> VerticalAlignment="Center"
<TextBlock Text="端口:" VerticalAlignment="Center"/> FontSize="16"
Foreground="#666666"
Icon="{x:Static ui:SegoeFluentIcons.ConnectApp}" />
<TextBlock VerticalAlignment="Center" Text="端口:" />
</StackPanel> </StackPanel>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding CurrentMqtt.Port}" <TextBlock
Margin="0,0,10,12" VerticalAlignment="Center" Grid.Row="1"
FontWeight="SemiBold" Foreground="#333333"/> Grid.Column="1"
Margin="0,0,10,12"
<StackPanel Grid.Row="1" Grid.Column="2" Orientation="Horizontal" Margin="0,0,5,12">
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.ContactInfo}"
FontSize="16"
VerticalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="#333333"
Text="{Binding CurrentMqtt.Port}" />
<StackPanel
Grid.Row="1"
Grid.Column="2"
Margin="0,0,5,12"
Orientation="Horizontal">
<ui:FontIcon
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> VerticalAlignment="Center"
<TextBlock Text="客户端ID:" VerticalAlignment="Center"/> FontSize="16"
Foreground="#666666"
Icon="{x:Static ui:SegoeFluentIcons.ContactInfo}" />
<TextBlock VerticalAlignment="Center" Text="客户端ID:" />
</StackPanel> </StackPanel>
<TextBlock Grid.Row="1" Grid.Column="3" Text="{Binding CurrentMqtt.ClientId}" <TextBlock
Margin="0,0,0,12" VerticalAlignment="Center" Grid.Row="1"
FontWeight="SemiBold" Foreground="#333333"/> Grid.Column="3"
Margin="0,0,0,12"
<StackPanel Grid.Row="2" Grid.Column="0" Orientation="Horizontal" Margin="0,0,5,12">
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.People}"
FontSize="16"
VerticalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="#333333"
Text="{Binding CurrentMqtt.ClientId}" />
<StackPanel
Grid.Row="2"
Grid.Column="0"
Margin="0,0,5,12"
Orientation="Horizontal">
<ui:FontIcon
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> VerticalAlignment="Center"
<TextBlock Text="用户名:" VerticalAlignment="Center"/> FontSize="16"
Foreground="#666666"
Icon="{x:Static ui:SegoeFluentIcons.People}" />
<TextBlock VerticalAlignment="Center" Text="用户名:" />
</StackPanel> </StackPanel>
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding CurrentMqtt.Username}" <TextBlock
Margin="0,0,10,12" VerticalAlignment="Center" Grid.Row="2"
FontWeight="SemiBold" Foreground="#333333"/> Grid.Column="1"
Margin="0,0,10,12"
<StackPanel Grid.Row="2" Grid.Column="2" Orientation="Horizontal" Margin="0,0,5,12">
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Lock}"
FontSize="16"
VerticalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="#333333"
Text="{Binding CurrentMqtt.Username}" />
<StackPanel
Grid.Row="2"
Grid.Column="2"
Margin="0,0,5,12"
Orientation="Horizontal">
<ui:FontIcon
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> VerticalAlignment="Center"
<TextBlock Text="密码:" VerticalAlignment="Center"/> FontSize="16"
Foreground="#666666"
Icon="{x:Static ui:SegoeFluentIcons.Lock}" />
<TextBlock VerticalAlignment="Center" Text="密码:" />
</StackPanel> </StackPanel>
<TextBlock Grid.Row="2" Grid.Column="3" Text="{Binding CurrentMqtt.Password}" <TextBlock
Margin="0,0,0,12" VerticalAlignment="Center" Grid.Row="2"
FontWeight="SemiBold" Foreground="#333333"/> Grid.Column="3"
Margin="0,0,0,12"
<StackPanel Grid.Row="3" Grid.Column="0" Orientation="Horizontal" Margin="0,0,5,12">
<ui:FontIcon FontFamily="{StaticResource MdFontIcons}"
Glyph="&#xF06A7;"
FontSize="16"
VerticalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="#333333"
Text="{Binding CurrentMqtt.Password}" />
<StackPanel
Grid.Row="3"
Grid.Column="0"
Margin="0,0,5,12"
Orientation="Horizontal">
<ui:FontIcon
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> VerticalAlignment="Center"
<TextBlock Text="发布主题:" VerticalAlignment="Center"/> FontFamily="{StaticResource MdFontIcons}"
FontSize="16"
Foreground="#666666"
Glyph="&#xF06A7;" />
<TextBlock VerticalAlignment="Center" Text="发布主题:" />
</StackPanel> </StackPanel>
<TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding CurrentMqtt.PublishTopic}" <TextBlock
Margin="0,0,10,12" VerticalAlignment="Center" Grid.Row="3"
FontWeight="SemiBold" Foreground="#333333"/> Grid.Column="1"
Margin="0,0,10,12"
<StackPanel Grid.Row="3" Grid.Column="2" Orientation="Horizontal" Margin="0,0,5,12">
<ui:FontIcon FontFamily="{StaticResource MdFontIcons}"
Glyph="&#xF009E;"
FontSize="16"
VerticalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="#333333"
Text="{Binding CurrentMqtt.PublishTopic}" />
<StackPanel
Grid.Row="3"
Grid.Column="2"
Margin="0,0,5,12"
Orientation="Horizontal">
<ui:FontIcon
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> VerticalAlignment="Center"
<TextBlock Text="订阅主题:" VerticalAlignment="Center"/> FontFamily="{StaticResource MdFontIcons}"
FontSize="16"
Foreground="#666666"
Glyph="&#xF009E;" />
<TextBlock VerticalAlignment="Center" Text="订阅主题:" />
</StackPanel> </StackPanel>
<TextBlock Grid.Row="3" Grid.Column="3" Text="{Binding CurrentMqtt.SubscribeTopic}" <TextBlock
Margin="0,0,0,12" VerticalAlignment="Center" Grid.Row="3"
FontWeight="SemiBold" Foreground="#333333"/> Grid.Column="3"
Margin="0,0,0,12"
<StackPanel Grid.Row="4" Grid.Column="0" Orientation="Horizontal" Margin="0,0,5,12">
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.PC1}"
FontSize="16"
VerticalAlignment="Center" VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="#333333"
Text="{Binding CurrentMqtt.SubscribeTopic}" />
<StackPanel
Grid.Row="4"
Grid.Column="0"
Margin="0,0,5,12"
Orientation="Horizontal">
<ui:FontIcon
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> VerticalAlignment="Center"
<TextBlock Text="平台:" VerticalAlignment="Center"/> FontSize="16"
Foreground="#666666"
Icon="{x:Static ui:SegoeFluentIcons.PC1}" />
<TextBlock VerticalAlignment="Center" Text="平台:" />
</StackPanel> </StackPanel>
<!-- <TextBlock Grid.Row="4" Grid.Column="1" Text="{Binding CurrentMqtt.MqttPlatform, Converter={StaticResource EnumDescriptionConverter}}" Margin="0,0,10,12" VerticalAlignment="Center" FontWeight="SemiBold" Foreground="#333333"/> --> <!-- <TextBlock Grid.Row="4" Grid.Column="1" Text="{Binding CurrentMqtt.MqttPlatform, Converter={StaticResource EnumDescriptionConverter}}" Margin="0,0,10,12" VerticalAlignment="Center" FontWeight="SemiBold" Foreground="#333333"/> -->
<StackPanel Grid.Row="5" Grid.Column="0" Orientation="Horizontal" Margin="0,0,5,12"> <StackPanel
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Mail}" Grid.Row="5"
FontSize="16" Grid.Column="0"
VerticalAlignment="Center" Margin="0,0,5,12"
Orientation="Horizontal">
<ui:FontIcon
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> VerticalAlignment="Center"
<TextBlock Text="消息头:" VerticalAlignment="Center"/> FontSize="16"
Foreground="#666666"
Icon="{x:Static ui:SegoeFluentIcons.Mail}" />
<TextBlock VerticalAlignment="Center" Text="消息头:" />
</StackPanel> </StackPanel>
<TextBlock Grid.Row="5" Grid.Column="1" Text="{Binding CurrentMqtt.MessageHeader}" <TextBlock
Margin="0,0,10,12" VerticalAlignment="Center" Grid.Row="5"
FontWeight="SemiBold" Foreground="#333333"/> Grid.Column="1"
Margin="0,0,10,12"
VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="#333333"
Text="{Binding CurrentMqtt.MessageHeader}" />
<StackPanel Grid.Row="5" Grid.Column="2" Orientation="Horizontal" Margin="0,0,5,12"> <StackPanel
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Mail}" Grid.Row="5"
FontSize="16" Grid.Column="2"
VerticalAlignment="Center" Margin="0,0,5,12"
Orientation="Horizontal">
<ui:FontIcon
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> VerticalAlignment="Center"
<TextBlock Text="消息内容:" VerticalAlignment="Center"/> FontSize="16"
Foreground="#666666"
Icon="{x:Static ui:SegoeFluentIcons.Mail}" />
<TextBlock VerticalAlignment="Center" Text="消息内容:" />
</StackPanel> </StackPanel>
<TextBlock Grid.Row="5" Grid.Column="3" Text="{Binding CurrentMqtt.MessageContent}" <TextBlock
Margin="0,0,0,12" VerticalAlignment="Center" Grid.Row="5"
FontWeight="SemiBold" Foreground="#333333"/> Grid.Column="3"
Margin="0,0,0,12"
VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="#333333"
Text="{Binding CurrentMqtt.MessageContent}" />
<StackPanel Grid.Row="6" Grid.Column="0" Orientation="Horizontal" Margin="0,0,5,0"> <StackPanel
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Mail}" Grid.Row="6"
FontSize="16" Grid.Column="0"
VerticalAlignment="Center"
Margin="0,0,5,0" Margin="0,0,5,0"
Foreground="#666666"/> Orientation="Horizontal">
<TextBlock Text="消息尾:" VerticalAlignment="Center"/> <ui:FontIcon
Margin="0,0,5,0"
VerticalAlignment="Center"
FontSize="16"
Foreground="#666666"
Icon="{x:Static ui:SegoeFluentIcons.Mail}" />
<TextBlock VerticalAlignment="Center" Text="消息尾:" />
</StackPanel> </StackPanel>
<TextBlock Grid.Row="6" Grid.Column="1" Text="{Binding CurrentMqtt.MessageFooter}" <TextBlock
Margin="0,0,10,0" VerticalAlignment="Center" Grid.Row="6"
FontWeight="SemiBold" Foreground="#333333"/> Grid.Column="1"
Margin="0,0,10,0"
VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="#333333"
Text="{Binding CurrentMqtt.MessageFooter}" />
</Grid> </Grid>
</StackPanel> </StackPanel>
</Border> </Border>
<!-- Associated Variables --> <!-- Associated Variables -->
<Border Background="White" BorderBrush="#E0E0E0" BorderThickness="1" CornerRadius="8" Margin="0,0,0,10" Padding="15"> <Border
Margin="0,0,0,10"
Padding="15"
Background="White"
BorderBrush="#E0E0E0"
BorderThickness="1"
CornerRadius="8">
<Border.Effect> <Border.Effect>
<DropShadowEffect ShadowDepth="2" BlurRadius="5" Opacity="0.1" Color="#888888"/> <DropShadowEffect
BlurRadius="5"
Opacity="0.1"
ShadowDepth="2"
Color="#888888" />
</Border.Effect> </Border.Effect>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto" />
<RowDefinition Height="*"/> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="关联变量" Style="{StaticResource SubtitleTextBlockStyle}" Margin="0,0,0,10"/> <TextBlock
<DataGrid Grid.Row="1" x:Name="AssociatedVariablesDataGrid" Grid.Row="0"
ItemsSource="{Binding CurrentMqtt.VariableAliases}" Margin="0,0,0,10"
Style="{StaticResource SubtitleTextBlockStyle}"
Text="关联变量" />
<DataGrid
x:Name="AssociatedVariablesDataGrid"
Grid.Row="1"
AutoGenerateColumns="False" AutoGenerateColumns="False"
CanUserAddRows="False" CanUserAddRows="False"
CanUserDeleteRows="False" CanUserDeleteRows="False"
IsReadOnly="True" IsReadOnly="True"
ItemsSource="{Binding CurrentMqtt.VariableAliases}"
SelectionMode="Extended"> SelectionMode="Extended">
<i:Interaction.Behaviors>
<helper:SelectedItemsBehavior SelectedItems="{Binding SelectedMqttAliaes}" />
</i:Interaction.Behaviors>
<DataGrid.ContextMenu> <DataGrid.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem Header="修改发送名称" Command="{Binding ModifyAliasCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=SelectedItems[0]}"/> <MenuItem
Command="{Binding ModifyAliasCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=SelectedItems[0]}"
Header="修改发送名称" />
</ContextMenu> </ContextMenu>
</DataGrid.ContextMenu> </DataGrid.ContextMenu>
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="设备名称" Binding="{Binding Variable.VariableTable.Device.Name}"/> <DataGridTextColumn Binding="{Binding Variable.VariableTable.Device.Name}" Header="设备名称" />
<DataGridTextColumn Header="变量表名称" Binding="{Binding Variable.VariableTable.Name}"/> <DataGridTextColumn Binding="{Binding Variable.VariableTable.Name}" Header="变量表名称" />
<DataGridTextColumn Header="变量名称" Binding="{Binding Variable.Name}"/> <DataGridTextColumn Binding="{Binding Variable.Name}" Header="变量名称" />
<DataGridTextColumn Header="MQTT发送名称" Binding="{Binding Alias}"/> <DataGridTextColumn Binding="{Binding Alias}" Header="MQTT发送名称" />
<DataGridTextColumn Header="地址" Binding="{Binding Variable.S7Address}"/> <DataGridTextColumn Binding="{Binding Variable.S7Address}" Header="地址" />
<DataGridTextColumn Header="数据类型" Binding="{Binding Variable.DataType}"/> <DataGridTextColumn Binding="{Binding Variable.DataType}" Header="数据类型" />
<DataGridTextColumn Header="显示值" Binding="{Binding Variable.DisplayValue}"/> <DataGridTextColumn Binding="{Binding Variable.DisplayValue}" Header="显示值" />
<DataGridTextColumn Header="更新时间" Binding="{Binding Variable.UpdatedAt, StringFormat='yyyy-MM-dd HH:mm:ss'}"/> <DataGridTextColumn Binding="{Binding Variable.UpdatedAt, StringFormat='yyyy-MM-dd HH:mm:ss'}" Header="更新时间" />
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>
</Grid> </Grid>