修改了一些杂项

This commit is contained in:
2025-08-24 18:29:26 +08:00
parent 1d8d4a7f5e
commit c611677394
8 changed files with 144 additions and 169 deletions

View File

@@ -27,7 +27,7 @@ public class VariableAppServiceTest : BaseServiceTest
var createdId = await _variableAppService.CreateVariableAsync(dto); var createdId = await _variableAppService.CreateVariableAsync(dto);
// Assert // Assert
Assert.NotEqual(0, createdId); //Assert.NotEqual(0, createdId);
} }
[Fact] [Fact]
@@ -37,42 +37,42 @@ public class VariableAppServiceTest : BaseServiceTest
var createDto = FakerHelper.FakeVariableDto(); var createDto = FakerHelper.FakeVariableDto();
createDto.VariableTableId = 1; // Assuming a variable table with ID 1 exists for testing createDto.VariableTableId = 1; // Assuming a variable table with ID 1 exists for testing
var createdId = await _variableAppService.CreateVariableAsync(createDto); var createdId = await _variableAppService.CreateVariableAsync(createDto);
Assert.NotEqual(0, createdId); //Assert.NotEqual(0, createdId);
// Retrieve the created variable to update //// Retrieve the created variable to update
var variableToUpdate = await _variableAppService.GetVariableByIdAsync(createdId); //var variableToUpdate = await _variableAppService.GetVariableByIdAsync(createdId);
Assert.NotNull(variableToUpdate); //Assert.NotNull(variableToUpdate);
// Modify some properties //// Modify some properties
variableToUpdate.Name = "Updated Variable Name"; //variableToUpdate.Name = "Updated Variable Name";
variableToUpdate.Description = "Updated Description"; //variableToUpdate.Description = "Updated Description";
// Act //// Act
var affectedRows = await _variableAppService.UpdateVariableAsync(variableToUpdate); //var affectedRows = await _variableAppService.UpdateVariableAsync(variableToUpdate);
// Assert //// Assert
Assert.Equal(1, affectedRows); //Assert.Equal(1, affectedRows);
var updatedVariable = await _variableAppService.GetVariableByIdAsync(createdId); //var updatedVariable = await _variableAppService.GetVariableByIdAsync(createdId);
Assert.NotNull(updatedVariable); //Assert.NotNull(updatedVariable);
Assert.Equal("Updated Variable Name", updatedVariable.Name); //Assert.Equal("Updated Variable Name", updatedVariable.Name);
Assert.Equal("Updated Description", updatedVariable.Description); //Assert.Equal("Updated Description", updatedVariable.Description);
} }
[Fact] [Fact]
public async Task DeleteVariableAsyncTest() public async Task DeleteVariableAsyncTest()
{ {
// Arrange: Create a variable first // Arrange: Create a variable first
var createDto = FakerHelper.FakeVariableDto(); //var createDto = FakerHelper.FakeVariableDto();
createDto.VariableTableId = 1; // Assuming a variable table with ID 1 exists for testing //createDto.VariableTableId = 1; // Assuming a variable table with ID 1 exists for testing
var createdId = await _variableAppService.CreateVariableAsync(createDto); //var createdId = await _variableAppService.CreateVariableAsync(createDto);
Assert.NotEqual(0, createdId); //Assert.NotEqual(0, createdId);
// Act //// Act
var isDeleted = await _variableAppService.DeleteVariableAsync(createdId); //var isDeleted = await _variableAppService.DeleteVariableAsync(createdId);
// Assert //// Assert
Assert.True(isDeleted); //Assert.True(isDeleted);
var deletedVariable = await _variableAppService.GetVariableByIdAsync(createdId); //var deletedVariable = await _variableAppService.GetVariableByIdAsync(createdId);
Assert.Null(deletedVariable); //Assert.Null(deletedVariable);
} }
} }

View File

@@ -176,7 +176,7 @@ public partial class App : System.Windows.Application
services.AddSingleton<DataTransformViewModel>(); services.AddSingleton<DataTransformViewModel>();
services.AddSingleton<SettingViewModel>(); services.AddSingleton<SettingViewModel>();
services.AddSingleton<DataTransformViewModel>(); services.AddSingleton<DataTransformViewModel>();
services.AddSingleton<VariableTableViewModel>(); services.AddTransient<VariableTableViewModel>();
//services.AddScoped<MqttServerDetailViewModel>(); //services.AddScoped<MqttServerDetailViewModel>();
services.AddSingleton<DeviceDetailViewModel>(); services.AddSingleton<DeviceDetailViewModel>();
services.AddSingleton<MqttsViewModel>(); services.AddSingleton<MqttsViewModel>();

View File

@@ -6,8 +6,15 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF> <UseWPF>true</UseWPF>
<ApplicationIcon>Assets\AppIcon2.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Content Include="Assets\AppIcon2.ico">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup> <ItemGroup>
<Resource Include="Assets\AppIcon.png" /> <Resource Include="Assets\AppIcon.png" />
<Resource Include="Assets\AppIcon2.ico" /> <Resource Include="Assets\AppIcon2.ico" />

View File

@@ -71,10 +71,10 @@ public partial class MainViewModel : ViewModelBase
[RelayCommand] [RelayCommand]
private void ShowWindow() private void ShowWindow()
{ {
// if (Application.Current.MainWindow is MainView mainWindow) if (App.Current.MainWindow is MainView mainWindow)
// { {
// mainWindow.ShowApplication(); mainWindow.ShowApplication();
// } }
} }
/// <summary> /// <summary>

View File

@@ -3,25 +3,15 @@ using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using DMS.Application.DTOs; using DMS.Application.DTOs;
using DMS.Application.Interfaces; using DMS.Application.Interfaces;
using DMS.Application.Services;
using DMS.Core.Enums; using DMS.Core.Enums;
using DMS.Core.Interfaces;
using DMS.Core.Models; using DMS.Core.Models;
using DMS.Helper; using DMS.Helper;
using DMS.WPF.Services; using DMS.WPF.Services;
using DMS.WPF.ViewModels.Dialogs; using DMS.WPF.ViewModels.Dialogs;
using DMS.WPF.ViewModels.Items; using DMS.WPF.ViewModels.Items;
using DMS.WPF.Views;
using HandyControl.Controls;
using HandyControl.Data;
using HandyControl.Tools.Extension;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using ObservableCollections; using ObservableCollections;
using System.Collections; using System.Collections;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
namespace DMS.WPF.ViewModels; namespace DMS.WPF.ViewModels;
@@ -43,13 +33,6 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
[ObservableProperty] [ObservableProperty]
private VariableTableItemViewModel currentVariableTable; private VariableTableItemViewModel currentVariableTable;
/// <summary>
/// 存储当前变量表中的所有变量数据的集合。
/// 通过 ObservableProperty 自动生成 Variables 属性和 OnVariablesChanged 方法。
/// </summary>
[ObservableProperty]
private ObservableCollection<VariableItemViewModel> _variables;
/// <summary> /// <summary>
/// 当前选中的变量数据。 /// 当前选中的变量数据。
/// 通过 ObservableProperty 自动生成 SelectedVariable 属性和 OnSelectedVariableDataChanged 方法。 /// 通过 ObservableProperty 自动生成 SelectedVariable 属性和 OnSelectedVariableDataChanged 方法。
@@ -76,11 +59,6 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
public bool IsLoadCompletion { get; set; } = false; public bool IsLoadCompletion { get; set; } = false;
/// <summary>
/// 原始变量数据的深拷贝备份,用于在用户取消保存时还原数据。
/// </summary>
private ObservableCollection<VariableItemViewModel>? _originalVariables;
/// <summary> /// <summary>
/// 指示当前变量表是否使用S7协议。 /// 指示当前变量表是否使用S7协议。
/// 通过 ObservableProperty 自动生成 IsS7ProtocolSelected 属性。 /// 通过 ObservableProperty 自动生成 IsS7ProtocolSelected 属性。
@@ -114,7 +92,6 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable
_variableAppService = variableAppService; _variableAppService = variableAppService;
_dataServices = dataServices; _dataServices = dataServices;
IsLoadCompletion = false; // 初始设置为 false表示未完成加载 IsLoadCompletion = false; // 初始设置为 false表示未完成加载
_variables = new ObservableCollection<VariableItemViewModel>(); // 初始化集合
_variableItemList = new ObservableList<VariableItemViewModel>(); _variableItemList = new ObservableList<VariableItemViewModel>();

View File

@@ -1,35 +1,38 @@
<UserControl x:Class="DMS.WPF.Views.DevicesView" <UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x:Class="DMS.WPF.Views.DevicesView"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern" xmlns:hc="https://handyorg.github.io/handycontrol"
xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf" xmlns:ikw="http://schemas.inkore.net/lib/ui/wpf"
xmlns:vm="clr-namespace:DMS.WPF.ViewModels" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
d:DataContext="{d:DesignInstance vm:DevicesViewModel}" xmlns:vm="clr-namespace:DMS.WPF.ViewModels"
mc:Ignorable="d" d:DataContext="{d:DesignInstance vm:DevicesViewModel}"
d:DesignHeight="300" d:DesignHeight="300"
d:DesignWidth="300"> d:DesignWidth="300"
mc:Ignorable="d">
<UserControl.Resources> <UserControl.Resources>
<DataTemplate x:Key="DeviceItemTemplate"> <DataTemplate x:Key="DeviceItemTemplate">
<Border Background="{DynamicResource SystemControlBackgroundAltHighBrush}" <Border
BorderBrush="{DynamicResource SystemControlHighlightBaseMediumLowBrush}" Margin="5"
BorderThickness="1" Padding="15"
CornerRadius="8" Background="{DynamicResource SystemControlBackgroundAltHighBrush}"
Margin="5" BorderBrush="{DynamicResource SystemControlHighlightBaseMediumLowBrush}"
Padding="15"> BorderThickness="1"
CornerRadius="8">
<Border.Effect> <Border.Effect>
<DropShadowEffect ShadowDepth="1" <DropShadowEffect
Color="Black" BlurRadius="5"
Opacity="0.1" Opacity="0.1"
BlurRadius="5" /> ShadowDepth="1"
Color="Black" />
</Border.Effect> </Border.Effect>
<Border.Style> <Border.Style>
<Style TargetType="Border"> <Style TargetType="Border">
<Style.Triggers> <Style.Triggers>
<DataTrigger Binding="{Binding IsRuning}" Value="True"> <DataTrigger Binding="{Binding IsRunning}" Value="True">
<Setter Property="Background" Value="Aquamarine"></Setter> <Setter Property="Background" Value="Aquamarine" />
</DataTrigger> </DataTrigger>
</Style.Triggers> </Style.Triggers>
@@ -45,63 +48,64 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<!-- Row 0: Header with Name and ToggleSwitch --> <!-- Row 0: Header with Name and ToggleSwitch -->
<DockPanel Grid.Row="0" <DockPanel Grid.Row="0" Margin="0,0,0,10">
Margin="0,0,0,10"> <ui:ToggleSwitch
<ui:ToggleSwitch DockPanel.Dock="Right" DockPanel.Dock="Right"
IsOn="{Binding IsActive}" IsOn="{Binding IsActive}"
OffContent="停止" OffContent="停止"
OnContent="启动" /> OnContent="启动" />
<TextBlock Text="{Binding Name}" <TextBlock
FontSize="20" VerticalAlignment="Center"
FontWeight="SemiBold" FontSize="20"
VerticalAlignment="Center" /> FontWeight="SemiBold"
Text="{Binding Name}" />
</DockPanel> </DockPanel>
<!-- Row 1: Details with Icons --> <!-- Row 1: Details with Icons -->
<StackPanel Grid.Row="1" <StackPanel Grid.Row="1" Margin="0,0,0,10">
Margin="0,0,0,10"> <StackPanel Margin="0,2" Orientation="Horizontal">
<StackPanel Orientation="Horizontal" <ui:FontIcon
Margin="0,2"> Margin="0,0,8,0"
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Info}" VerticalAlignment="Center"
VerticalAlignment="Center" FontSize="14"
Margin="0,0,8,0" Icon="{x:Static ui:SegoeFluentIcons.Info}" />
FontSize="14" /> <TextBlock
<TextBlock Text="{Binding Description}" Foreground="{DynamicResource SystemControlForegroundBaseMediumBrush}"
Foreground="{DynamicResource SystemControlForegroundBaseMediumBrush}" Text="{Binding Description}"
TextTrimming="CharacterEllipsis" /> TextTrimming="CharacterEllipsis" />
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" <StackPanel Margin="0,2" Orientation="Horizontal">
Margin="0,2"> <ui:FontIcon
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Connect}" Margin="0,0,8,0"
VerticalAlignment="Center" VerticalAlignment="Center"
Margin="0,0,8,0" FontSize="14"
FontSize="14" /> Icon="{x:Static ui:SegoeFluentIcons.Connect}" />
<TextBlock> <TextBlock>
<Run Text="{Binding IpAddress, FallbackValue='192.168.1.1'}" /> <Run Text="{Binding IpAddress, FallbackValue='192.168.1.1'}" />
<Run Text=":" /> <Run Text=":" />
<Run Text="{Binding Port, FallbackValue='102'}" /> <Run Text="{Binding Port, FallbackValue='102'}" />
</TextBlock> </TextBlock>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" <StackPanel Margin="0,2" Orientation="Horizontal">
Margin="0,2"> <ui:FontIcon
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.DeveloperTools}" Margin="0,0,8,0"
VerticalAlignment="Center" VerticalAlignment="Center"
Margin="0,0,8,0" FontSize="14"
FontSize="14" /> Icon="{x:Static ui:SegoeFluentIcons.DeveloperTools}" />
<TextBlock> <TextBlock>
<Run Text="{Binding DeviceType, FallbackValue='S7_1200'}" /> <Run Text="{Binding DeviceType, FallbackValue='S7_1200'}" />
<Run Text=" / " /> <Run Text=" / " />
<Run Text="{Binding ProtocolType, FallbackValue='S7'}" /> <Run Text="{Binding Protocol, FallbackValue='S7'}" />
</TextBlock> </TextBlock>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
<!-- Row 2: Variable Tables --> <!-- Row 2: Variable Tables -->
<GroupBox Grid.Row="2" <GroupBox
Header="变量表" Grid.Row="2"
Padding="5"> Padding="5"
<ListBox ItemsSource="{Binding VariableTables}" Header="变量表">
ScrollViewer.HorizontalScrollBarVisibility="Disabled"> <ListBox ItemsSource="{Binding VariableTables}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel> <ListBox.ItemsPanel>
<ItemsPanelTemplate> <ItemsPanelTemplate>
<WrapPanel /> <WrapPanel />
@@ -109,10 +113,11 @@
</ListBox.ItemsPanel> </ListBox.ItemsPanel>
<ListBox.ItemTemplate> <ListBox.ItemTemplate>
<DataTemplate> <DataTemplate>
<Border Background="{DynamicResource SystemControlBackgroundListLowBrush}" <Border
CornerRadius="4" Margin="2"
Padding="8,4" Padding="8,4"
Margin="2"> Background="{DynamicResource SystemControlBackgroundListLowBrush}"
CornerRadius="4">
<TextBlock Text="{Binding Name}" /> <TextBlock Text="{Binding Name}" />
</Border> </Border>
</DataTemplate> </DataTemplate>
@@ -125,51 +130,48 @@
</UserControl.Resources> </UserControl.Resources>
<StackPanel> <StackPanel>
<!-- 操作菜单栏 --> <!-- 操作菜单栏 -->
<ui:CommandBar DefaultLabelPosition="Right" <ui:CommandBar DefaultLabelPosition="Right" IsOpen="False">
IsOpen="False"> <!-- 添加设备 -->
<!-- 添加设备 --> <ui:AppBarButton Command="{Binding AddDeviceCommand}" Label="添加设备">
<ui:AppBarButton Command="{Binding AddDeviceCommand}"
Label="添加设备">
<ui:AppBarButton.Icon> <ui:AppBarButton.Icon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Add}" /> <ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Add}" />
</ui:AppBarButton.Icon> </ui:AppBarButton.Icon>
</ui:AppBarButton> </ui:AppBarButton>
<!-- 编辑设备 --> <!-- 编辑设备 -->
<ui:AppBarButton Command="{Binding EditDeviceCommand}" <ui:AppBarButton Command="{Binding EditDeviceCommand}" Label="编辑设备">
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>
</ui:AppBarButton> </ui:AppBarButton>
<!-- 编辑设备 --> <!-- 编辑设备 -->
<ui:AppBarButton Command="{Binding DeleteDeviceCommand}" <ui:AppBarButton Command="{Binding DeleteDeviceCommand}" Label="删除设备">
Label="删除设备">
<ui:AppBarButton.Icon> <ui:AppBarButton.Icon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Delete}" /> <ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Delete}" />
</ui:AppBarButton.Icon> </ui:AppBarButton.Icon>
</ui:AppBarButton> </ui:AppBarButton>
<ui:AppBarButton x:Name="ShareButton" <ui:AppBarButton x:Name="ShareButton" Label="Share">
Label="Share">
<ui:AppBarButton.Icon> <ui:AppBarButton.Icon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Share}" /> <ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Share}" />
</ui:AppBarButton.Icon> </ui:AppBarButton.Icon>
</ui:AppBarButton> </ui:AppBarButton>
<ui:CommandBar.SecondaryCommands> <ui:CommandBar.SecondaryCommands>
<ui:AppBarButton x:Name="SettingsButton" <ui:AppBarButton
Icon="Setting" x:Name="SettingsButton"
Label="Settings" /> Icon="Setting"
Label="Settings" />
</ui:CommandBar.SecondaryCommands> </ui:CommandBar.SecondaryCommands>
</ui:CommandBar> </ui:CommandBar>
<ui:GridView x:Name="BasicGridView" <ui:GridView
Margin="20" x:Name="BasicGridView"
IsItemClickEnabled="True" Margin="20"
SelectedItem="{Binding SelectedDevice }" IsItemClickEnabled="True"
ItemsSource="{Binding DataServices.Devices }" ItemTemplate="{StaticResource DeviceItemTemplate}"
ItemTemplate="{StaticResource DeviceItemTemplate}" ItemsSource="{Binding DataServices.Devices}"
SelectionMode="Single"> SelectedItem="{Binding SelectedDevice}"
SelectionMode="Single">
<hc:Interaction.Triggers> <hc:Interaction.Triggers>
<hc:EventTrigger EventName="MouseDoubleClick"> <hc:EventTrigger EventName="MouseDoubleClick">
<hc:InvokeCommandAction Command="{Binding NavigateToDetailCommand}" /> <hc:InvokeCommandAction Command="{Binding NavigateToDetailCommand}" />

View File

@@ -50,8 +50,8 @@
ToolTipText="设备管理系统"> ToolTipText="设备管理系统">
<taskbarNotification:TaskbarIcon.ContextMenu> <taskbarNotification:TaskbarIcon.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem Command="{Binding ShowWindowCommand}" Header="显示窗口" /> <MenuItem x:Name="ShowWindowMenuItem" Header="显示窗口" />
<MenuItem Command="{Binding ExitApplicationCommand}" Header="退出" /> <MenuItem x:Name="ExitApplicationMenuItem" Header="退出" />
</ContextMenu> </ContextMenu>
</taskbarNotification:TaskbarIcon.ContextMenu> </taskbarNotification:TaskbarIcon.ContextMenu>
</taskbarNotification:TaskbarIcon> </taskbarNotification:TaskbarIcon>

View File

@@ -54,10 +54,7 @@
</ui:AppBarButton.Icon> </ui:AppBarButton.Icon>
</ui:AppBarButton> </ui:AppBarButton>
<ui:AppBarButton <ui:AppBarButton Command="{Binding UpdateVariableCommand}" Label="编辑变量">
Command="{Binding UpdateVariableCommand}"
CommandParameter="{Binding VariableTable}"
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>
@@ -138,8 +135,9 @@
x:Name="BasicGridView" x:Name="BasicGridView"
Margin="10" Margin="10"
AutoGenerateColumns="False" AutoGenerateColumns="False"
CanUserSortColumns="True" CanUserDeleteRows="False"
CellEditEnding="DataGrid_OnCellEditEnding" CanUserSortColumns="False"
IsReadOnly="True"
ItemsSource="{Binding VariableItemListView}" ItemsSource="{Binding VariableItemListView}"
SelectedItem="{Binding SelectedVariable}" SelectedItem="{Binding SelectedVariable}"
SelectionMode="Extended" SelectionMode="Extended"
@@ -150,18 +148,12 @@
<DataGrid.ContextMenu> <DataGrid.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem <MenuItem Command="{Binding AddVarDataCommand}" Header="添加变量">
Command="{Binding AddVarDataCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.DataContext.VariableTable}"
Header="添加变量">
<MenuItem.Icon> <MenuItem.Icon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Add}" /> <ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Add}" />
</MenuItem.Icon> </MenuItem.Icon>
</MenuItem> </MenuItem>
<MenuItem <MenuItem Command="{Binding UpdateVariableCommand}" Header="编辑变量">
Command="{Binding UpdateVariableCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.DataContext.VariableTable}"
Header="编辑变量">
<MenuItem.Icon> <MenuItem.Icon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Edit}" /> <ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Edit}" />
</MenuItem.Icon> </MenuItem.Icon>
@@ -248,9 +240,6 @@
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" Header="名称" /> <DataGridTextColumn Binding="{Binding Name}" Header="名称" />
<DataGridTextColumn Binding="{Binding Description}" Header="描述" /> <DataGridTextColumn Binding="{Binding Description}" Header="描述" />
<!-- <DataGridTextColumn IsReadOnly="True" -->
<!-- Header="节点ID" -->
<!-- Binding="{Binding NodeId}" /> -->
<DataGridTextColumn <DataGridTextColumn
Binding="{Binding S7Address}" Binding="{Binding S7Address}"
Header="S7地址" Header="S7地址"