From c85f89db3377bb014a475c1cd76fbd852d474740 Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Mon, 6 Oct 2025 18:17:56 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=E5=B0=86=E6=89=80=E6=9C=89=E7=9A=84It?= =?UTF-8?q?emViewMdoel=E7=9A=84=E5=90=8D=E5=AD=97=E5=88=A0=E9=99=A4ViewMod?= =?UTF-8?q?el=EF=BC=8C=E5=B9=B6=E5=B0=86=E5=91=BD=E5=90=8D=E7=A9=BA?= =?UTF-8?q?=E9=97=B4=E8=B0=83=E6=95=B4=E4=B8=BADMS.WPF.ItemViewModel.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DMS.Infrastructure.UnitTests.csproj | 33 ---- DMS.Infrastructure.UnitTests/ExampleTest.cs | 18 -- DMS.Infrastructure.UnitTests/FakerHelper.cs | 171 ------------------ .../Services/BaseServiceTest.cs | 64 ------- .../Services/DeviceAppServiceTest.cs | 69 ------- .../Services/InitializeServiceTest.cs | 24 --- .../Services/VariableAppServiceTest.cs | 80 -------- .../Services/VariableTableAppServiceTest.cs | 87 --------- DMS.WPF.UnitTests/DMS.WPF.UnitTests.csproj | 33 ---- DMS.WPF.UnitTests/UnitTest1.cs | 10 - .../ViewModelTest/BaseServiceTest.cs | 72 -------- .../ViewModelTest/DevicesViewModelTests.cs | 36 ---- DMS.WPF/App.xaml.cs | 4 +- .../Factories/VariableItemViewModelFactory.cs | 8 +- DMS.WPF/Interfaces/IDataStorageService.cs | 18 +- DMS.WPF/Interfaces/IDeviceDataService.cs | 8 +- DMS.WPF/Interfaces/ILogDataService.cs | 2 +- DMS.WPF/Interfaces/IMenuDataService.cs | 6 +- DMS.WPF/Interfaces/IMqttDataService.cs | 8 +- DMS.WPF/Interfaces/INavigatable.cs | 2 +- DMS.WPF/Interfaces/INavigationService.cs | 2 +- DMS.WPF/Interfaces/ITriggerDataService.cs | 8 +- DMS.WPF/Interfaces/IVariableDataService.cs | 8 +- .../Interfaces/IVariableTableDataService.cs | 6 +- .../DeviceItem.cs} | 8 +- .../MenuItem.cs} | 6 +- .../Items => ItemViewModel}/MqttAliasItem.cs | 6 +- .../MqttServerItem.cs} | 4 +- .../NlogItem.cs} | 10 +- .../OpcUaNodeItem.cs} | 10 +- .../TriggerItem.cs} | 4 +- .../UserItem.cs} | 4 +- .../VariableHistoryItem.cs} | 4 +- .../VariableItem.cs} | 6 +- .../VariableTableItem.cs} | 8 +- DMS.WPF/Profiles/MappingProfile.cs | 29 +-- DMS.WPF/Services/DataEventService.cs | 2 +- DMS.WPF/Services/DataStorageService.cs | 35 ++-- DMS.WPF/Services/DeviceDataService.cs | 16 +- DMS.WPF/Services/LogDataService.cs | 6 +- DMS.WPF/Services/MenuDataService.cs | 34 ++-- DMS.WPF/Services/MqttDataService.cs | 14 +- DMS.WPF/Services/NavigationService.cs | 2 +- DMS.WPF/Services/TriggerDataService.cs | 12 +- DMS.WPF/Services/VariableDataService.cs | 10 +- DMS.WPF/Services/VariableTableDataService.cs | 8 +- DMS.WPF/Services/WPFDataService.cs | 2 +- DMS.WPF/ViewModels/DeviceDetailViewModel.cs | 30 +-- DMS.WPF/ViewModels/DevicesViewModel.cs | 48 ++--- .../Dialogs/DeviceDialogViewModel.cs | 10 +- .../Dialogs/ImportExcelDialogViewModel.cs | 8 +- .../Dialogs/ImportOpcUaDialogViewModel.cs | 22 +-- .../MqttAliasBatchEditDialogViewModel.cs | 12 +- .../ViewModels/Dialogs/MqttDialogViewModel.cs | 12 +- .../Dialogs/MqttSelectionDialogViewModel.cs | 10 +- .../Dialogs/TriggerDialogViewModel.cs | 22 +-- .../Dialogs/VariableDialogViewModel.cs | 10 +- .../Dialogs/VariableTableDialogViewModel.cs | 10 +- DMS.WPF/ViewModels/LogHistoryViewModel.cs | 20 +- DMS.WPF/ViewModels/MainViewModel.cs | 4 +- .../ViewModels/MqttServerDetailViewModel.cs | 4 +- DMS.WPF/ViewModels/MqttsViewModel.cs | 12 +- DMS.WPF/ViewModels/TriggersViewModel.cs | 8 +- .../ViewModels/VariableHistoryViewModel.cs | 6 +- DMS.WPF/ViewModels/VariableTableViewModel.cs | 38 ++-- DMS.WPF/ViewModels/ViewModelBase.cs | 2 +- .../Views/Dialogs/ImportOpcUaDialog.xaml.cs | 4 +- DMS.WPF/Views/Dialogs/TriggerDialog.xaml | 6 +- DMS.WPF/Views/Dialogs/TriggerDialog.xaml.cs | 6 +- DMS.WPF/Views/MainView.xaml.cs | 4 +- DMS.WPF/Views/VariableTableView.xaml.cs | 2 +- DMS.sln | 12 -- 72 files changed, 316 insertions(+), 1023 deletions(-) delete mode 100644 DMS.Infrastructure.UnitTests/DMS.Infrastructure.UnitTests.csproj delete mode 100644 DMS.Infrastructure.UnitTests/ExampleTest.cs delete mode 100644 DMS.Infrastructure.UnitTests/FakerHelper.cs delete mode 100644 DMS.Infrastructure.UnitTests/Services/BaseServiceTest.cs delete mode 100644 DMS.Infrastructure.UnitTests/Services/DeviceAppServiceTest.cs delete mode 100644 DMS.Infrastructure.UnitTests/Services/InitializeServiceTest.cs delete mode 100644 DMS.Infrastructure.UnitTests/Services/VariableAppServiceTest.cs delete mode 100644 DMS.Infrastructure.UnitTests/Services/VariableTableAppServiceTest.cs delete mode 100644 DMS.WPF.UnitTests/DMS.WPF.UnitTests.csproj delete mode 100644 DMS.WPF.UnitTests/UnitTest1.cs delete mode 100644 DMS.WPF.UnitTests/ViewModelTest/BaseServiceTest.cs delete mode 100644 DMS.WPF.UnitTests/ViewModelTest/DevicesViewModelTests.cs rename DMS.WPF/{ViewModels/Items/DeviceItemViewModel.cs => ItemViewModel/DeviceItem.cs} (91%) rename DMS.WPF/{ViewModels/Items/MenuItemViewModel.cs => ItemViewModel/MenuItem.cs} (93%) rename DMS.WPF/{ViewModels/Items => ItemViewModel}/MqttAliasItem.cs (77%) rename DMS.WPF/{ViewModels/Items/MqttServerItemViewModel.cs => ItemViewModel/MqttServerItem.cs} (92%) rename DMS.WPF/{ViewModels/Items/NlogItemViewModel.cs => ItemViewModel/NlogItem.cs} (73%) rename DMS.WPF/{ViewModels/Items/OpcUaNodeItemViewModel.cs => ItemViewModel/OpcUaNodeItem.cs} (74%) rename DMS.WPF/{ViewModels/Items/TriggerItemViewModel.cs => ItemViewModel/TriggerItem.cs} (96%) rename DMS.WPF/{ViewModels/Items/UserItemViewModel.cs => ItemViewModel/UserItem.cs} (74%) rename DMS.WPF/{ViewModels/Items/VariableHistoryItemViewModel.cs => ItemViewModel/VariableHistoryItem.cs} (73%) rename DMS.WPF/{ViewModels/Items/VariableItemViewModel.cs => ItemViewModel/VariableItem.cs} (98%) rename DMS.WPF/{ViewModels/Items/VariableTableItemViewModel.cs => ItemViewModel/VariableTableItem.cs} (70%) diff --git a/DMS.Infrastructure.UnitTests/DMS.Infrastructure.UnitTests.csproj b/DMS.Infrastructure.UnitTests/DMS.Infrastructure.UnitTests.csproj deleted file mode 100644 index f5a0273..0000000 --- a/DMS.Infrastructure.UnitTests/DMS.Infrastructure.UnitTests.csproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - net8.0 - enable - enable - - false - true - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DMS.Infrastructure.UnitTests/ExampleTest.cs b/DMS.Infrastructure.UnitTests/ExampleTest.cs deleted file mode 100644 index 7422db1..0000000 --- a/DMS.Infrastructure.UnitTests/ExampleTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Xunit; - -namespace DMS.Infrastructure.UnitTests -{ - public class VariableTableRepositoryTests - { - public VariableTableRepositoryTests() - { - - } - - [Fact] - public void AddAsync() - { - Assert.True(true); - } - } -} \ No newline at end of file diff --git a/DMS.Infrastructure.UnitTests/FakerHelper.cs b/DMS.Infrastructure.UnitTests/FakerHelper.cs deleted file mode 100644 index b7665f7..0000000 --- a/DMS.Infrastructure.UnitTests/FakerHelper.cs +++ /dev/null @@ -1,171 +0,0 @@ -using Bogus; -using DMS.Infrastructure.Entities; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using DMS.Application.DTOs; -using DMS.Core.Enums; -using DMS.Core.Models; - -namespace DMS.Infrastructure.UnitTests -{ - public static class FakerHelper - { - public static Device FakeDevice() - { - var dbDevice = new Faker() - .RuleFor(d => d.Name, f => f.Commerce.ProductName()) - .RuleFor(d => d.Description, f => f.Commerce.ProductDescription()) - .RuleFor(d => d.IpAddress, f => f.Internet.Ip()) - .RuleFor(d => d.OpcUaServerUrl, f => f.Internet.Url()) - .Generate(); - dbDevice.Port = 102; - dbDevice.Protocol = ProtocolType.S7; - dbDevice.Slot = 1; - dbDevice.Rack = 0; - dbDevice.CpuType = CpuType.S71200; - dbDevice.DeviceType = Core.Enums.DeviceType.SiemensPLC; - - return dbDevice; - } - - public static VariableTable FakeVariableTable() - { - var varTable = new Faker() - .RuleFor(d => d.Name, f => f.Commerce.ProductName()) - .RuleFor(d => d.Description, f => f.Commerce.ProductDescription()) - .Generate(); - varTable.IsActive = true; - return varTable; - } - - - public static VariableTableDto FakeVariableTableDto() - { - var varTable = new Faker() - .RuleFor(d => d.Name, f => f.Commerce.ProductName()) - .RuleFor(d => d.Description, f => f.Commerce.ProductDescription()) - .Generate(); - varTable.IsActive = true; - return varTable; - } - - public static Variable FakeVariable() - { - var dbVariable = new Faker() - .RuleFor(d => d.Name, f => f.Commerce.ProductName()) - .RuleFor(d => d.S7Address, f => $"DB1.DBD{f.Random.Int(0, 1000)}") - .RuleFor(d => d.OpcUaNodeId, f => $"ns=2;s=My.DbDevice.Variable{f.Random.Int(1, 100)}") - .RuleFor(d => d.ConversionFormula, f => "x * 1.0") - .RuleFor(d => d.UpdatedBy, f => f.Name.FullName()) - .Generate(); - - // dbVariable.DataType = 1; - // dbVariable.PollLevel = 1; - dbVariable.IsActive = true; - dbVariable.VariableTableId = 1; - dbVariable.IsHistoryEnabled = true; - dbVariable.HistoryDeadband = 0.1; - dbVariable.IsAlarmEnabled = false; - dbVariable.AlarmMinValue = 0; - dbVariable.AlarmMaxValue = 100; - dbVariable.AlarmDeadband = 1; - dbVariable.Protocol = 0; - dbVariable.DataType = 0; - dbVariable.CreatedAt = DateTime.Now; - dbVariable.UpdatedAt = DateTime.Now; - dbVariable.IsModified = false; - - return dbVariable; - } - - public static DbMenu FakeDbMenu() - { - var dbMenu = new Faker() - .RuleFor(d => d.Header, f => f.Commerce.Department()) - .RuleFor(d => d.Icon, f => f.Random.Word()) - .RuleFor(d => d.DisplayOrder, f => f.Random.Number(1, 10)) - .Generate(); - dbMenu.ParentId = 0; - dbMenu.Childrens = new List(); - return dbMenu; - } - - public static DbMqttServer FakeDbMqttServer() - { - var dbMqttServer = new Faker() - .RuleFor(d => d.ServerName, f => f.Company.CompanyName()) - .RuleFor(d => d.ServerUrl, f => f.Internet.Ip()) - .RuleFor(d => d.Username, f => f.Internet.UserName()) - .RuleFor(d => d.Password, f => f.Internet.Password()) - .RuleFor(d => d.SubscribeTopic, f => "/topic/sub") - .RuleFor(d => d.PublishTopic, f => "/topic/pub") - .RuleFor(d => d.ClientId, f => Guid.NewGuid() - .ToString()) - .RuleFor(d => d.MessageFormat, f => "JSON") - .Generate(); - dbMqttServer.Port = 1883; - dbMqttServer.IsActive = true; - dbMqttServer.CreatedAt = DateTime.Now; - return dbMqttServer; - } - - // public static CreateDeviceDto FakeCreateDeviceDto() - // { - // var deviceDto = new Faker() - // .RuleFor(d => d.Name, f => f.Commerce.ProductName()) - // .RuleFor(d => d.Description, f => f.Commerce.ProductDescription()) - // .RuleFor(d => d.IpAddress, f => f.Internet.Ip()) - // .RuleFor(d => d.OpcUaServerUrl, f => f.Internet.Url()) - // .Generate(); - // deviceDto.Port = 102; - // deviceDto.Protocol = ProtocolType.S7; - // deviceDto.Slot = 1; - // deviceDto.Rack = 0; - // deviceDto.CpuType = "S7-1200"; - // deviceDto.DeviceType = Core.Enums.DeviceType.SiemensPLC; - // - // return deviceDto; - // } - - public static MenuBeanDto FakeCreateMenuDto() - { - var menuDto = new Faker() - .RuleFor(m => m.Header, f => f.Commerce.ProductName()) - .RuleFor(m => m.Icon, f => f.Random.Word()) - .RuleFor(m => m.DisplayOrder, f => f.Random.Number(1, 100)) - .RuleFor(m => m.ParentId, f => f.Random.Number(0, 10)) // 假设可以有父菜单 - .Generate(); - return menuDto; - } - - public static VariableDto FakeVariableDto() - { - var variableDto = new Faker() - .RuleFor(v => v.Name, f => f.Commerce.ProductName()) - .RuleFor(v => v.S7Address, f => $"DB1.DBD{f.Random.Int(0, 1000)}") - .RuleFor(v => v.SignalType, f => f.PickRandom()) - .RuleFor(v => v.PollingInterval, f => f.Random.Int(10, 1800000)) - .RuleFor(v => v.IsActive, f => f.Random.Bool()) - .RuleFor(v => v.IsHistoryEnabled, f => f.Random.Bool()) - .RuleFor(v => v.HistoryDeadband, f => f.Random.Double(0.0, 1.0)) - .RuleFor(v => v.IsAlarmEnabled, f => f.Random.Bool()) - .RuleFor(v => v.AlarmMinValue, f => f.Random.Double(0.0, 50.0)) - .RuleFor(v => v.AlarmMaxValue, f => f.Random.Double(50.0, 100.0)) - .RuleFor(v => v.AlarmDeadband, f => f.Random.Double(0.0, 1.0)) - .RuleFor(v => v.Protocol, f => f.PickRandom()) - .RuleFor(v => v.DataType, f => f.PickRandom(Enum.GetValues())) - .RuleFor(v => v.OpcUaNodeId, f => $"ns=2;s=My.Variable{f.Random.Int(1, 100)}") - .RuleFor(v => v.ConversionFormula, f => "x * 1.0") - .RuleFor(v => v.UpdatedBy, f => f.Name.FullName()) - .RuleFor(v => v.DataValue, f => f.Random.Double(0, 100).ToString()) - .RuleFor(v => v.DisplayValue, f => f.Random.Word()) - .RuleFor(v => v.Description, f => f.Lorem.Sentence()) - .Generate(); - variableDto.VariableTableId = 1; // Default to 1 for testing purposes - return variableDto; - } - } -} diff --git a/DMS.Infrastructure.UnitTests/Services/BaseServiceTest.cs b/DMS.Infrastructure.UnitTests/Services/BaseServiceTest.cs deleted file mode 100644 index df40f39..0000000 --- a/DMS.Infrastructure.UnitTests/Services/BaseServiceTest.cs +++ /dev/null @@ -1,64 +0,0 @@ -// DMS.Infrastructure.UnitTests/Services/BaseServiceTest.cs - -using AutoMapper; -using AutoMapper.Internal; -using DMS.Application.Configurations; -using DMS.Application.Interfaces; -using DMS.Application.Interfaces.Database; -using DMS.Application.Services; -using DMS.Application.Services.Database; -using DMS.Core.Interfaces; -using DMS.Core.Interfaces.Repositories; -using DMS.Infrastructure.Data; -using DMS.Infrastructure.Repositories; -using Microsoft.Extensions.DependencyInjection; - - -namespace DMS.Infrastructure.UnitTests.Services; - -public class BaseServiceTest -{ - // ServiceProvider 将是所有测试的服务容器 - protected readonly IServiceProvider ServiceProvider; - - public BaseServiceTest() - { - var services = new ServiceCollection(); - - // --- 核心配置 --- - services.AddAutoMapper(cfg => - { - // 最终解决方案:根据异常信息的建议,设置此标记以忽略重复的Profile加载。 - // 注意:此属性位于 Internal() 方法下。 - cfg.Internal().AllowAdditiveTypeMapCreation = true; - - cfg.AddProfile(new DMS.Application.Profiles.MappingProfile()); - cfg.AddProfile(new DMS.Infrastructure.Profiles.MappingProfile()); - }); - - // 2. 配置数据库上下文 (在测试中通常使用单例) - services.AddSingleton(); - - // --- 注册服务和仓储 --- - // 使用 Transient 或 Scoped 取决于服务的生命周期需求,对于测试,Transient 通常更安全。 - - // 注册仓储管理器 - services.AddTransient(); - services.AddTransient(); - - // 注册应用服务 - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - // services.AddTransient(); // 如果需要测试 VariableService,取消此行注释 - // ... 在这里注册所有其他的应用服务 ... - - - // --- 构建服务提供程序 --- - ServiceProvider = services.BuildServiceProvider(); - - // 验证 AutoMapper 配置 (可选,但强烈推荐) - var mapper = ServiceProvider.GetService(); - mapper?.ConfigurationProvider.AssertConfigurationIsValid(); - } -} diff --git a/DMS.Infrastructure.UnitTests/Services/DeviceAppServiceTest.cs b/DMS.Infrastructure.UnitTests/Services/DeviceAppServiceTest.cs deleted file mode 100644 index 25a5ca0..0000000 --- a/DMS.Infrastructure.UnitTests/Services/DeviceAppServiceTest.cs +++ /dev/null @@ -1,69 +0,0 @@ -using DMS.Application.DTOs; -using DMS.Application.Interfaces; -using DMS.Application.Interfaces.Database; -using DMS.Application.Services; -using DMS.Application.Services.Database; -using JetBrains.Annotations; -using Microsoft.Extensions.DependencyInjection; - -namespace DMS.Infrastructure.UnitTests.Services; - -[TestSubject(typeof(DeviceAppService))] -public class DeviceAppServiceTest : BaseServiceTest // 继承基类 -{ - private readonly IDeviceAppService _deviceService; - - public DeviceAppServiceTest() : base() - { - // 从 IoC 容器中解析出需要测试的服务 - // 使用 GetRequiredService 可以确保如果服务未注册,测试会立即失败,这通常是我们想要的。 - _deviceService = ServiceProvider.GetRequiredService(); - } - - [Fact] - public async Task CreateDeviceWithDetailsAsyncTest() - { - // Arrange - // var dto = new CreateDeviceWithDetailsDto - // { - // Device = FakerHelper.FakeCreateDeviceDto(), - // VariableTable = FakerHelper.FakeVariableTableDto(), - // DeviceMenu = FakerHelper.FakeCreateMenuDto(), - // VariableTableMenu = FakerHelper.FakeCreateMenuDto() - // - // // ... 填充其他需要的数据 - // }; - // - // // Act - // var addDto = await _deviceService.CreateDeviceWithDetailsAsync(dto); - // - // // Assert - // Assert.NotEqual(0, addDto.Device.Id); - } - - [Fact] - public async Task DeleteDeviceAsyncTest() - { - // Act - var isSuccess = await _deviceService.DeleteDeviceByIdAsync(4); - - // Assert - Assert.Equal(isSuccess,true); - } - - [Fact] - public async Task UpdateDeviceAsyncTest() - { - // UpdateDeviceDto dto = new UpdateDeviceDto() - // { - // Id = 5, - // Name = "lalala", - // IsActive = true, - // Rack = 0, - // Slot = 0 - // - // }; - // var res = await _deviceService.UpdateDeviceAsync(dto); - // Assert.NotEqual(res,0); - } -} \ No newline at end of file diff --git a/DMS.Infrastructure.UnitTests/Services/InitializeServiceTest.cs b/DMS.Infrastructure.UnitTests/Services/InitializeServiceTest.cs deleted file mode 100644 index b0f837c..0000000 --- a/DMS.Infrastructure.UnitTests/Services/InitializeServiceTest.cs +++ /dev/null @@ -1,24 +0,0 @@ -using DMS.Application.Interfaces; -using DMS.Application.Services; -using DMS.Core.Interfaces.Repositories; -using JetBrains.Annotations; -using Microsoft.Extensions.DependencyInjection; - -namespace DMS.Infrastructure.UnitTests.Services; - -[TestSubject(typeof(InitializeService))] -public class InitializeServiceTest:BaseServiceTest -{ - private readonly IInitializeRepository _initializeRepository; - - public InitializeServiceTest() - { - _initializeRepository = ServiceProvider.GetRequiredService(); - } - - [Fact] - public void InitializeTablesTest() - { - _initializeRepository.InitializeTables(); - } -} \ No newline at end of file diff --git a/DMS.Infrastructure.UnitTests/Services/VariableAppServiceTest.cs b/DMS.Infrastructure.UnitTests/Services/VariableAppServiceTest.cs deleted file mode 100644 index a74cd02..0000000 --- a/DMS.Infrastructure.UnitTests/Services/VariableAppServiceTest.cs +++ /dev/null @@ -1,80 +0,0 @@ -using DMS.Application.DTOs; -using DMS.Application.Interfaces; -using DMS.Application.Interfaces.Database; -using DMS.Application.Services; -using DMS.Application.Services.Database; -using JetBrains.Annotations; -using Microsoft.Extensions.DependencyInjection; - -namespace DMS.Infrastructure.UnitTests.Services; - -[TestSubject(typeof(VariableAppService))] -public class VariableAppServiceTest : BaseServiceTest -{ - private readonly IVariableAppService _variableAppService; - - public VariableAppServiceTest() - { - _variableAppService = ServiceProvider.GetRequiredService(); - } - - [Fact] - public async Task CreateVariableAsyncTest() - { - // Arrange - var dto = FakerHelper.FakeVariableDto(); - dto.VariableTableId = 1; // Assuming a variable table with ID 1 exists for testing - - // Act - var createdId = await _variableAppService.CreateVariableAsync(dto); - - // Assert - //Assert.NotEqual(0, createdId); - } - - [Fact] - public async Task UpdateVariableAsyncTest() - { - // Arrange: Create a variable first - var createDto = FakerHelper.FakeVariableDto(); - createDto.VariableTableId = 1; // Assuming a variable table with ID 1 exists for testing - var createdId = await _variableAppService.CreateVariableAsync(createDto); - //Assert.NotEqual(0, createdId); - - //// Retrieve the created variable to update - //var variableToUpdate = await _variableAppService.GetVariableByIdAsync(createdId); - //Assert.NotNull(variableToUpdate); - - //// Modify some properties - //variableToUpdate.Name = "Updated Variable Name"; - //variableToUpdate.Description = "Updated Description"; - - //// Act - //var affectedRows = await _variableAppService.UpdateVariableAsync(variableToUpdate); - - //// Assert - //Assert.Equal(1, affectedRows); - //var updatedVariable = await _variableAppService.GetVariableByIdAsync(createdId); - //Assert.NotNull(updatedVariable); - //Assert.Equal("Updated Variable Name", updatedVariable.Name); - //Assert.Equal("Updated Description", updatedVariable.Description); - } - - [Fact] - public async Task DeleteVariableAsyncTest() - { - // Arrange: Create a variable first - //var createDto = FakerHelper.FakeVariableDto(); - //createDto.VariableTableId = 1; // Assuming a variable table with ID 1 exists for testing - //var createdId = await _variableAppService.CreateVariableAsync(createDto); - //Assert.NotEqual(0, createdId); - - //// Act - //var isDeleted = await _variableAppService.DeleteVariableAsync(createdId); - - //// Assert - //Assert.True(isDeleted); - //var deletedVariable = await _variableAppService.GetVariableByIdAsync(createdId); - //Assert.Null(deletedVariable); - } -} \ No newline at end of file diff --git a/DMS.Infrastructure.UnitTests/Services/VariableTableAppServiceTest.cs b/DMS.Infrastructure.UnitTests/Services/VariableTableAppServiceTest.cs deleted file mode 100644 index 9c51353..0000000 --- a/DMS.Infrastructure.UnitTests/Services/VariableTableAppServiceTest.cs +++ /dev/null @@ -1,87 +0,0 @@ -using DMS.Application.DTOs; -using DMS.Application.Interfaces; -using DMS.Application.Interfaces.Database; -using DMS.Application.Services; -using DMS.Application.Services.Database; -using JetBrains.Annotations; -using Microsoft.Extensions.DependencyInjection; - -namespace DMS.Infrastructure.UnitTests.Services; - -[TestSubject(typeof(VariableTableAppService))] -public class VariableTableAppServiceTest : BaseServiceTest -{ - private readonly IVariableTableAppService _variableTableAppService; - - public VariableTableAppServiceTest() - { - _variableTableAppService = ServiceProvider.GetRequiredService(); - } - - [Fact] - public async Task CreateVariableTableAsyncTest() - { - var dto = new CreateVariableTableWithMenuDto() - { - VariableTable = FakerHelper.FakeVariableTableDto(), - Menu = FakerHelper.FakeCreateMenuDto(), - DeviceId = 5 - }; - var addVarTable= await _variableTableAppService.CreateVariableTableAsync(dto); - Assert.NotEqual(addVarTable.VariableTable.Id, 0); - } - - [Fact] - public async Task DeleteVariableTableAsyncTest() - { - // Arrange: Create a variable table first - var createDto = new CreateVariableTableWithMenuDto() - { - VariableTable = FakerHelper.FakeVariableTableDto(), - Menu = FakerHelper.FakeCreateMenuDto(), - DeviceId = 5 // Assuming a device with ID 5 exists for testing - }; - var createdVariableTable = await _variableTableAppService.CreateVariableTableAsync(createDto); - Assert.NotEqual(createdVariableTable.VariableTable.Id, 0); - - // Act: Delete the created variable table - var isDeleted = await _variableTableAppService.DeleteVariableTableAsync(createdVariableTable.VariableTable.Id); - - // Assert: Verify deletion was successful - Assert.True(isDeleted); - - // Optionally, try to retrieve the deleted variable table to confirm it's gone - var deletedTable = await _variableTableAppService.GetVariableTableByIdAsync(createdVariableTable.VariableTable.Id); - Assert.Null(deletedTable); - } - - [Fact] - public async Task UpdateVariableTableAsyncTest() - { - // Arrange: Create a variable table first - var createDto = new CreateVariableTableWithMenuDto() - { - VariableTable = FakerHelper.FakeVariableTableDto(), - Menu = FakerHelper.FakeCreateMenuDto(), - DeviceId = 5 // Assuming a device with ID 5 exists for testing - }; - var createdVariableTable = await _variableTableAppService.CreateVariableTableAsync(createDto); - Assert.NotEqual(createdVariableTable.VariableTable.Id, 0); - - // Modify some properties of the DTO - createdVariableTable.VariableTable.Name = "Updated Variable Table Name"; - createdVariableTable.VariableTable.Description = "This is an updated description."; - - // Act: Update the variable table - var affectedRows = await _variableTableAppService.UpdateVariableTableAsync(createdVariableTable.VariableTable); - - // Assert: Verify update was successful - Assert.Equal(1, affectedRows); - - // Retrieve the updated variable table to confirm changes - var updatedTable = await _variableTableAppService.GetVariableTableByIdAsync(createdVariableTable.VariableTable.Id); - Assert.NotNull(updatedTable); - Assert.Equal("Updated Variable Table Name", updatedTable.Name); - Assert.Equal("This is an updated description.", updatedTable.Description); - } -} \ No newline at end of file diff --git a/DMS.WPF.UnitTests/DMS.WPF.UnitTests.csproj b/DMS.WPF.UnitTests/DMS.WPF.UnitTests.csproj deleted file mode 100644 index f36b8b0..0000000 --- a/DMS.WPF.UnitTests/DMS.WPF.UnitTests.csproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - net8.0-windows7.0 - enable - enable - - false - true - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/DMS.WPF.UnitTests/UnitTest1.cs b/DMS.WPF.UnitTests/UnitTest1.cs deleted file mode 100644 index cbd3518..0000000 --- a/DMS.WPF.UnitTests/UnitTest1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace DMS.WPF.UnitTests; - -public class UnitTest1 -{ - [Fact] - public void Test1() - { - - } -} \ No newline at end of file diff --git a/DMS.WPF.UnitTests/ViewModelTest/BaseServiceTest.cs b/DMS.WPF.UnitTests/ViewModelTest/BaseServiceTest.cs deleted file mode 100644 index 827a0e2..0000000 --- a/DMS.WPF.UnitTests/ViewModelTest/BaseServiceTest.cs +++ /dev/null @@ -1,72 +0,0 @@ -// DMS.Infrastructure.UnitTests/Services/BaseServiceTest.cs - -using AutoMapper; -using AutoMapper.Internal; -using DMS.Application.Configurations; -using DMS.Application.Interfaces.Database; -using DMS.Application.Services.Database; -using DMS.Core.Interfaces; -using DMS.Core.Interfaces.Repositories; -using DMS.Infrastructure.Data; -using DMS.Infrastructure.Repositories; -using DMS.WPF.Interfaces; -using DMS.WPF.Services; -using DMS.WPF.ViewModels; -using Microsoft.Extensions.DependencyInjection; - -namespace DMS.WPF.UnitTests.ViewModelTest; - -public class BaseServiceTest -{ - // ServiceProvider 将是所有测试的服务容器 - protected readonly IServiceProvider ServiceProvider; - - public BaseServiceTest() - { - var services = new ServiceCollection(); - - // --- 核心配置 --- - services.AddAutoMapper(cfg => - { - // 最终解决方案:根据异常信息的建议,设置此标记以忽略重复的Profile加载。 - // 注意:此属性位于 Internal() 方法下。 - cfg.Internal().AllowAdditiveTypeMapCreation = true; - - cfg.AddProfile(new DMS.Application.Profiles.MappingProfile()); - cfg.AddProfile(new DMS.Infrastructure.Profiles.MappingProfile()); - cfg.AddProfile(new DMS.WPF.Profiles.MappingProfile()); - }); - - // 2. 配置数据库上下文 (在测试中通常使用单例) - services.AddSingleton(); - - // --- 注册服务和仓储 --- - // 使用 Transient 或 Scoped 取决于服务的生命周期需求,对于测试,Transient 通常更安全。 - - // 注册仓储管理器 - services.AddTransient(); - services.AddTransient(); - - // 注册应用服务 - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - // services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - // services.AddTransient(); - services.AddTransient(); - // services.AddTransient(); // 如果需要测试 - // VariableService,取消此行注释 - // ... 在这里注册所有其他的应用服务 ... - - - - // --- 构建服务提供程序 --- - ServiceProvider = services.BuildServiceProvider(); - - // 验证 AutoMapper 配置 (可选,但强烈推荐) - var mapper = ServiceProvider.GetService(); - mapper?.ConfigurationProvider.AssertConfigurationIsValid(); - } -} diff --git a/DMS.WPF.UnitTests/ViewModelTest/DevicesViewModelTests.cs b/DMS.WPF.UnitTests/ViewModelTest/DevicesViewModelTests.cs deleted file mode 100644 index 52bc15c..0000000 --- a/DMS.WPF.UnitTests/ViewModelTest/DevicesViewModelTests.cs +++ /dev/null @@ -1,36 +0,0 @@ -using AutoMapper; -using DMS.Application.DTOs; -using DMS.Application.Interfaces; -using DMS.WPF.Services; -using DMS.WPF.ViewModels; -using DMS.WPF.ViewModels.Dialogs; -using DMS.WPF.ViewModels.Items; -using Microsoft.Extensions.DependencyInjection; -using Moq; - -namespace DMS.WPF.UnitTests.ViewModelTest -{ - public class DevicesViewModelTests:BaseServiceTest - { - private readonly DevicesViewModel _devicesViewModel; - - - public DevicesViewModelTests() - { - _devicesViewModel= ServiceProvider.GetRequiredService(); - } - - [Fact] - public async Task AddDevice_Test() - { - // Arrange - - // Act - await _devicesViewModel.AddDevice(); - - - } - - - } -} \ No newline at end of file diff --git a/DMS.WPF/App.xaml.cs b/DMS.WPF/App.xaml.cs index 523c241..78b42bb 100644 --- a/DMS.WPF/App.xaml.cs +++ b/DMS.WPF/App.xaml.cs @@ -32,7 +32,7 @@ using DMS.WPF.Logging; using DMS.WPF.Services; using DMS.WPF.ViewModels; using DMS.WPF.ViewModels.Dialogs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using DMS.WPF.Views; using LiveChartsCore; using LiveChartsCore.SkiaSharpView; @@ -81,7 +81,7 @@ public partial class App : System.Windows.Application { Host.Services.GetRequiredService(); Host.Services.GetRequiredService(); - DeviceItemViewModel.EventService = Host.Services.GetRequiredService(); + DeviceItem.EventService = Host.Services.GetRequiredService(); // 初始化数据处理链 var dataProcessingService = Host.Services.GetRequiredService(); dataProcessingService.AddProcessor(Host.Services.GetRequiredService()); diff --git a/DMS.WPF/Factories/VariableItemViewModelFactory.cs b/DMS.WPF/Factories/VariableItemViewModelFactory.cs index 46ad0a5..3fa07e6 100644 --- a/DMS.WPF/Factories/VariableItemViewModelFactory.cs +++ b/DMS.WPF/Factories/VariableItemViewModelFactory.cs @@ -1,5 +1,5 @@ using DMS.Application.DTOs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using DMS.Application.Configurations; using Microsoft.Extensions.DependencyInjection; @@ -16,7 +16,7 @@ namespace DMS.WPF.Factories /// /// 变量数据传输对象 /// VariableItemViewModel实例 - VariableItemViewModel CreateNewVariableItemViewModel(); + VariableItem CreateNewVariableItemViewModel(); } @@ -35,10 +35,10 @@ namespace DMS.WPF.Factories /// /// 变量数据传输对象 /// VariableItemViewModel实例 - public VariableItemViewModel CreateNewVariableItemViewModel() + public VariableItem CreateNewVariableItemViewModel() { - var viewModel = new VariableItemViewModel() + var viewModel = new VariableItem() { IsActive = _appSettings.VariableImportTemplate.IsActive, diff --git a/DMS.WPF/Interfaces/IDataStorageService.cs b/DMS.WPF/Interfaces/IDataStorageService.cs index 15a9a34..d0df143 100644 --- a/DMS.WPF/Interfaces/IDataStorageService.cs +++ b/DMS.WPF/Interfaces/IDataStorageService.cs @@ -1,6 +1,6 @@ using System.Collections.Concurrent; using System.Collections.ObjectModel; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using ObservableCollections; namespace DMS.WPF.Interfaces; @@ -10,40 +10,40 @@ public interface IDataStorageService /// /// 设备列表。 /// - ObservableDictionary Devices { get; set; } + ObservableDictionary Devices { get; set; } /// /// 设备列表。 /// - ObservableDictionary VariableTables { get; set; } + ObservableDictionary VariableTables { get; set; } /// /// 变量数据列表。 /// - ObservableDictionary Variables { get; set; } + ObservableDictionary Variables { get; set; } /// /// MQTT服务器列表。 /// - ObservableDictionary MqttServers { get; set; } + ObservableDictionary MqttServers { get; set; } /// /// 菜单列表。 /// - ObservableCollection Menus { get; set; } + ObservableCollection Menus { get; set; } /// /// 菜单树列表。 /// - ObservableCollection MenuTrees { get; set; } + ObservableCollection MenuTrees { get; set; } /// /// 日志列表。 /// - ObservableCollection Nlogs { get; set; } + ObservableCollection Nlogs { get; set; } /// /// 触发器列表。 /// - ObservableDictionary Triggers { get; set; } + ObservableDictionary Triggers { get; set; } } \ No newline at end of file diff --git a/DMS.WPF/Interfaces/IDeviceDataService.cs b/DMS.WPF/Interfaces/IDeviceDataService.cs index ad3d70a..fbf6b12 100644 --- a/DMS.WPF/Interfaces/IDeviceDataService.cs +++ b/DMS.WPF/Interfaces/IDeviceDataService.cs @@ -1,6 +1,6 @@ using System.Collections.ObjectModel; using DMS.Application.DTOs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Interfaces; @@ -12,7 +12,7 @@ public interface IDeviceDataService /// /// 设备列表。 /// - // ObservableCollection Devices { get; set; } + // ObservableCollection Devices { get; set; } /// /// 加载所有设备数据。 @@ -27,10 +27,10 @@ public interface IDeviceDataService /// /// 删除设备。 /// - Task DeleteDevice(DeviceItemViewModel device); + Task DeleteDevice(DeviceItem device); /// /// 更新设备。 /// - Task UpdateDevice(DeviceItemViewModel device); + Task UpdateDevice(DeviceItem device); } \ No newline at end of file diff --git a/DMS.WPF/Interfaces/ILogDataService.cs b/DMS.WPF/Interfaces/ILogDataService.cs index 5903948..0fb4aec 100644 --- a/DMS.WPF/Interfaces/ILogDataService.cs +++ b/DMS.WPF/Interfaces/ILogDataService.cs @@ -1,6 +1,6 @@ using System.Collections.ObjectModel; using DMS.Application.Events; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Interfaces; diff --git a/DMS.WPF/Interfaces/IMenuDataService.cs b/DMS.WPF/Interfaces/IMenuDataService.cs index f79428a..2d5a3d7 100644 --- a/DMS.WPF/Interfaces/IMenuDataService.cs +++ b/DMS.WPF/Interfaces/IMenuDataService.cs @@ -1,5 +1,5 @@ using System.Collections.ObjectModel; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Interfaces; @@ -13,12 +13,12 @@ public interface IMenuDataService /// /// 添加菜单项。 /// - Task AddMenuItem(MenuItemViewModel menuItemViewModel); + Task AddMenuItem(MenuItem MenuItem); /// /// 删除菜单项。 /// - Task DeleteMenuItem(MenuItemViewModel? menuItemViewModel); + Task DeleteMenuItem(MenuItem? MenuItem); void LoadAllMenus(); diff --git a/DMS.WPF/Interfaces/IMqttDataService.cs b/DMS.WPF/Interfaces/IMqttDataService.cs index e352f94..10f1be7 100644 --- a/DMS.WPF/Interfaces/IMqttDataService.cs +++ b/DMS.WPF/Interfaces/IMqttDataService.cs @@ -1,6 +1,6 @@ using System.Collections.ObjectModel; using DMS.Application.DTOs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Interfaces; @@ -19,15 +19,15 @@ public interface IMqttDataService /// /// 添加MQTT服务器。 /// - Task AddMqttServer(MqttServerItemViewModel mqttServer); + Task AddMqttServer(MqttServerItem mqttServer); /// /// 更新MQTT服务器。 /// - Task UpdateMqttServer(MqttServerItemViewModel mqttServer); + Task UpdateMqttServer(MqttServerItem mqttServer); /// /// 删除MQTT服务器。 /// - Task DeleteMqttServer(MqttServerItemViewModel mqttServer); + Task DeleteMqttServer(MqttServerItem mqttServer); } \ No newline at end of file diff --git a/DMS.WPF/Interfaces/INavigatable.cs b/DMS.WPF/Interfaces/INavigatable.cs index 247876e..c812308 100644 --- a/DMS.WPF/Interfaces/INavigatable.cs +++ b/DMS.WPF/Interfaces/INavigatable.cs @@ -1,7 +1,7 @@ // 文件: DMS.WPF/Services/INavigatable.cs using DMS.Core.Models; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Interfaces; diff --git a/DMS.WPF/Interfaces/INavigationService.cs b/DMS.WPF/Interfaces/INavigationService.cs index 4569c35..2d9cf3f 100644 --- a/DMS.WPF/Interfaces/INavigationService.cs +++ b/DMS.WPF/Interfaces/INavigationService.cs @@ -1,7 +1,7 @@ // 文件: DMS.WPF/Services/INavigationService.cs using DMS.Core.Models; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Interfaces; diff --git a/DMS.WPF/Interfaces/ITriggerDataService.cs b/DMS.WPF/Interfaces/ITriggerDataService.cs index b179ea5..d5b2eb0 100644 --- a/DMS.WPF/Interfaces/ITriggerDataService.cs +++ b/DMS.WPF/Interfaces/ITriggerDataService.cs @@ -1,6 +1,6 @@ using System.Collections.ObjectModel; using DMS.Application.DTOs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Interfaces; @@ -17,15 +17,15 @@ public interface ITriggerDataService /// /// 添加触发器。 /// - Task AddTrigger(TriggerItemViewModel dto); + Task AddTrigger(TriggerItem dto); /// /// 删除触发器。 /// - Task DeleteTrigger(TriggerItemViewModel trigger); + Task DeleteTrigger(TriggerItem trigger); /// /// 更新触发器。 /// - Task UpdateTrigger(TriggerItemViewModel trigger); + Task UpdateTrigger(TriggerItem trigger); } \ No newline at end of file diff --git a/DMS.WPF/Interfaces/IVariableDataService.cs b/DMS.WPF/Interfaces/IVariableDataService.cs index a7762c3..fc1cdb8 100644 --- a/DMS.WPF/Interfaces/IVariableDataService.cs +++ b/DMS.WPF/Interfaces/IVariableDataService.cs @@ -1,6 +1,6 @@ using System.Collections.ObjectModel; using DMS.Application.DTOs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Interfaces; @@ -23,17 +23,17 @@ public interface IVariableDataService /// /// 更新变量表。 /// - Task UpdateVariableTable(VariableTableItemViewModel variableTable); + Task UpdateVariableTable(VariableTableItem variableTable); /// /// 删除变量表。 /// - Task DeleteVariableTable(VariableTableItemViewModel variableTable, bool isDeleteDb = false); + Task DeleteVariableTable(VariableTableItem variableTable, bool isDeleteDb = false); /// /// 添加变量。 /// - void AddVariable(VariableItemViewModel variableItem); + void AddVariable(VariableItem variableItem); /// /// 删除变量。 diff --git a/DMS.WPF/Interfaces/IVariableTableDataService.cs b/DMS.WPF/Interfaces/IVariableTableDataService.cs index b36ef85..7daf229 100644 --- a/DMS.WPF/Interfaces/IVariableTableDataService.cs +++ b/DMS.WPF/Interfaces/IVariableTableDataService.cs @@ -1,6 +1,6 @@ using System.Collections.ObjectModel; using DMS.Application.DTOs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Interfaces; @@ -12,6 +12,6 @@ public interface IVariableTableDataService Task AddVariableTable(VariableTableDto variableTableDto, MenuBeanDto menuDto = null, bool isAddDb = false); - Task UpdateVariableTable(VariableTableItemViewModel variableTable); - Task DeleteVariableTable(VariableTableItemViewModel variableTable, bool isDeleteDb = false); + Task UpdateVariableTable(VariableTableItem variableTable); + Task DeleteVariableTable(VariableTableItem variableTable, bool isDeleteDb = false); } \ No newline at end of file diff --git a/DMS.WPF/ViewModels/Items/DeviceItemViewModel.cs b/DMS.WPF/ItemViewModel/DeviceItem.cs similarity index 91% rename from DMS.WPF/ViewModels/Items/DeviceItemViewModel.cs rename to DMS.WPF/ItemViewModel/DeviceItem.cs index 4a9712a..5aaba13 100644 --- a/DMS.WPF/ViewModels/Items/DeviceItemViewModel.cs +++ b/DMS.WPF/ItemViewModel/DeviceItem.cs @@ -1,4 +1,4 @@ -// 文件: DMS.WPF/ViewModels/Items/DeviceItemViewModel.cs +// 文件: DMS.WPF/ViewModels/Items/DeviceItem.cs using System.Collections.ObjectModel; using CommunityToolkit.Mvvm.ComponentModel; @@ -8,13 +8,13 @@ using DMS.Core.Enums; using DMS.Core.Events; using DMS.WPF.Interfaces; -namespace DMS.WPF.ViewModels.Items; +namespace DMS.WPF.ItemViewModel; /// /// 代表设备列表中的单个设备项的ViewModel。 /// 实现了INotifyPropertyChanged,其任何属性变化都会自动通知UI。 /// -public partial class DeviceItemViewModel : ObservableObject +public partial class DeviceItem : ObservableObject { // 用于访问事件服务的静态属性 public static IEventService EventService { get; set; } @@ -97,7 +97,7 @@ public partial class DeviceItemViewModel : ObservableObject } } - public ObservableCollection VariableTables { get; set; } = new(); + public ObservableCollection VariableTables { get; set; } = new(); [ObservableProperty] private bool _isConnected; diff --git a/DMS.WPF/ViewModels/Items/MenuItemViewModel.cs b/DMS.WPF/ItemViewModel/MenuItem.cs similarity index 93% rename from DMS.WPF/ViewModels/Items/MenuItemViewModel.cs rename to DMS.WPF/ItemViewModel/MenuItem.cs index e673088..980cf27 100644 --- a/DMS.WPF/ViewModels/Items/MenuItemViewModel.cs +++ b/DMS.WPF/ItemViewModel/MenuItem.cs @@ -6,14 +6,14 @@ using DMS.Application.DTOs; using DMS.Core.Enums; using DMS.WPF.Services; -namespace DMS.WPF.ViewModels.Items; +namespace DMS.WPF.ItemViewModel; /// /// 菜单项视图模型 /// 用于在WPF界面中绑定和显示菜单项数据,实现MVVM模式 /// 继承自ObservableObject以支持属性更改通知 /// -public partial class MenuItemViewModel : ObservableObject +public partial class MenuItem : ObservableObject { /// /// 菜单项的唯一标识符 @@ -77,5 +77,5 @@ public partial class MenuItemViewModel : ObservableObject /// 使用ObservableCollection以支持动态添加和删除子项并自动更新UI /// [ObservableProperty] - private ObservableCollection _children = new(); + private ObservableCollection _children = new(); } \ No newline at end of file diff --git a/DMS.WPF/ViewModels/Items/MqttAliasItem.cs b/DMS.WPF/ItemViewModel/MqttAliasItem.cs similarity index 77% rename from DMS.WPF/ViewModels/Items/MqttAliasItem.cs rename to DMS.WPF/ItemViewModel/MqttAliasItem.cs index d8a51ed..8b4662a 100644 --- a/DMS.WPF/ViewModels/Items/MqttAliasItem.cs +++ b/DMS.WPF/ItemViewModel/MqttAliasItem.cs @@ -1,7 +1,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using DMS.Application.DTOs; -namespace DMS.WPF.ViewModels.Items; +namespace DMS.WPF.ItemViewModel; public partial class MqttAliasItem : ObservableObject { @@ -20,8 +20,8 @@ public partial class MqttAliasItem : ObservableObject private string _alias; [ObservableProperty] - private MqttServerItemViewModel _mqttServer; + private MqttServerItem _mqttServer; [ObservableProperty] - private VariableItemViewModel _variable; + private VariableItem _variable; } diff --git a/DMS.WPF/ViewModels/Items/MqttServerItemViewModel.cs b/DMS.WPF/ItemViewModel/MqttServerItem.cs similarity index 92% rename from DMS.WPF/ViewModels/Items/MqttServerItemViewModel.cs rename to DMS.WPF/ItemViewModel/MqttServerItem.cs index fe1acb2..ebfde09 100644 --- a/DMS.WPF/ViewModels/Items/MqttServerItemViewModel.cs +++ b/DMS.WPF/ItemViewModel/MqttServerItem.cs @@ -4,9 +4,9 @@ using System; using System.Collections.ObjectModel; using System.Linq; -namespace DMS.WPF.ViewModels.Items; +namespace DMS.WPF.ItemViewModel; -public partial class MqttServerItemViewModel : ObservableObject +public partial class MqttServerItem : ObservableObject { public int Id { get; set; } diff --git a/DMS.WPF/ViewModels/Items/NlogItemViewModel.cs b/DMS.WPF/ItemViewModel/NlogItem.cs similarity index 73% rename from DMS.WPF/ViewModels/Items/NlogItemViewModel.cs rename to DMS.WPF/ItemViewModel/NlogItem.cs index 6fc76cb..215ef57 100644 --- a/DMS.WPF/ViewModels/Items/NlogItemViewModel.cs +++ b/DMS.WPF/ItemViewModel/NlogItem.cs @@ -1,18 +1,18 @@ using CommunityToolkit.Mvvm.ComponentModel; using DMS.Core.Models; -namespace DMS.WPF.ViewModels.Items; +namespace DMS.WPF.ItemViewModel; -public class NlogItemViewModel : ObservableObject +public class NlogItem : ObservableObject { private Nlog _nlog; - public NlogItemViewModel() + public NlogItem() { _nlog = new Nlog(); } - public NlogItemViewModel(Nlog nlog) + public NlogItem(Nlog nlog) { _nlog = nlog; } @@ -25,5 +25,5 @@ public class NlogItemViewModel : ObservableObject public string Logger => _nlog.Logger; public string Exception => _nlog.Exception; public string StackTrace => _nlog.Exception; // Using Exception as StackTrace since it's not in the Nlog model - public System.DateTime TimeStamp => _nlog.LogTime; + public DateTime TimeStamp => _nlog.LogTime; } \ No newline at end of file diff --git a/DMS.WPF/ViewModels/Items/OpcUaNodeItemViewModel.cs b/DMS.WPF/ItemViewModel/OpcUaNodeItem.cs similarity index 74% rename from DMS.WPF/ViewModels/Items/OpcUaNodeItemViewModel.cs rename to DMS.WPF/ItemViewModel/OpcUaNodeItem.cs index 1f3f6e3..7cfe1f4 100644 --- a/DMS.WPF/ViewModels/Items/OpcUaNodeItemViewModel.cs +++ b/DMS.WPF/ItemViewModel/OpcUaNodeItem.cs @@ -3,12 +3,12 @@ using DMS.Infrastructure.Models; using Opc.Ua; using System.Collections.ObjectModel; -namespace DMS.WPF.ViewModels.Items +namespace DMS.WPF.ItemViewModel { /// /// OPC UA节点的视图模型。 /// - public partial class OpcUaNodeItemViewModel : ObservableObject + public partial class OpcUaNodeItem : ObservableObject { [ObservableProperty] @@ -27,10 +27,10 @@ namespace DMS.WPF.ViewModels.Items private string? _dataType; [ObservableProperty] - private OpcUaNodeItemViewModel? _parentNode; + private OpcUaNodeItem? _parentNode; [ObservableProperty] - private ObservableCollection _children = new ObservableCollection(); + private ObservableCollection _children = new ObservableCollection(); [ObservableProperty] private bool _isExpanded; @@ -41,7 +41,7 @@ namespace DMS.WPF.ViewModels.Items /// /// 默认构造函数(用于设计时支持)。 /// - public OpcUaNodeItemViewModel() + public OpcUaNodeItem() { // 设计时数据支持 diff --git a/DMS.WPF/ViewModels/Items/TriggerItemViewModel.cs b/DMS.WPF/ItemViewModel/TriggerItem.cs similarity index 96% rename from DMS.WPF/ViewModels/Items/TriggerItemViewModel.cs rename to DMS.WPF/ItemViewModel/TriggerItem.cs index 3bd589a..adf57b9 100644 --- a/DMS.WPF/ViewModels/Items/TriggerItemViewModel.cs +++ b/DMS.WPF/ItemViewModel/TriggerItem.cs @@ -3,12 +3,12 @@ using CommunityToolkit.Mvvm.ComponentModel; using DMS.Application.DTOs; using DMS.Core.Models.Triggers; -namespace DMS.WPF.ViewModels.Items +namespace DMS.WPF.ItemViewModel { /// /// 触发器项视图模型 /// - public partial class TriggerItemViewModel : ObservableObject + public partial class TriggerItem : ObservableObject { /// /// 触发器唯一标识符 diff --git a/DMS.WPF/ViewModels/Items/UserItemViewModel.cs b/DMS.WPF/ItemViewModel/UserItem.cs similarity index 74% rename from DMS.WPF/ViewModels/Items/UserItemViewModel.cs rename to DMS.WPF/ItemViewModel/UserItem.cs index 224064d..e9b908b 100644 --- a/DMS.WPF/ViewModels/Items/UserItemViewModel.cs +++ b/DMS.WPF/ItemViewModel/UserItem.cs @@ -1,9 +1,9 @@ using CommunityToolkit.Mvvm.ComponentModel; using DMS.Application.DTOs; -namespace DMS.WPF.ViewModels.Items; +namespace DMS.WPF.ItemViewModel; -public partial class UserItemViewModel : ObservableObject +public partial class UserItem : ObservableObject { public int Id { get; set; } diff --git a/DMS.WPF/ViewModels/Items/VariableHistoryItemViewModel.cs b/DMS.WPF/ItemViewModel/VariableHistoryItem.cs similarity index 73% rename from DMS.WPF/ViewModels/Items/VariableHistoryItemViewModel.cs rename to DMS.WPF/ItemViewModel/VariableHistoryItem.cs index f9d190c..78fba6f 100644 --- a/DMS.WPF/ViewModels/Items/VariableHistoryItemViewModel.cs +++ b/DMS.WPF/ItemViewModel/VariableHistoryItem.cs @@ -2,9 +2,9 @@ using CommunityToolkit.Mvvm.ComponentModel; using DMS.Application.DTOs; using System; -namespace DMS.WPF.ViewModels.Items; +namespace DMS.WPF.ItemViewModel; -public partial class VariableHistoryItemViewModel : ObservableObject +public partial class VariableHistoryItem : ObservableObject { public long Id { get; set; } diff --git a/DMS.WPF/ViewModels/Items/VariableItemViewModel.cs b/DMS.WPF/ItemViewModel/VariableItem.cs similarity index 98% rename from DMS.WPF/ViewModels/Items/VariableItemViewModel.cs rename to DMS.WPF/ItemViewModel/VariableItem.cs index 3544464..c7d78bc 100644 --- a/DMS.WPF/ViewModels/Items/VariableItemViewModel.cs +++ b/DMS.WPF/ItemViewModel/VariableItem.cs @@ -6,14 +6,14 @@ using System.Collections.Generic; using DMS.Application.Configurations; using Microsoft.Extensions.DependencyInjection; -namespace DMS.WPF.ViewModels.Items; +namespace DMS.WPF.ItemViewModel; /// /// 表示单个变量项的视图模型。 /// 此类用于UI层的数据绑定,封装了变量数据以及与UI相关的状态和逻辑。 /// 它继承自 ObservableObject,以便于实现 INotifyPropertyChanged 接口,从而支持WPF的双向绑定。 /// -public partial class VariableItemViewModel : ObservableObject +public partial class VariableItem : ObservableObject { /// /// 获取或设置变量的唯一标识符 (ID)。 @@ -120,7 +120,7 @@ public partial class VariableItemViewModel : ObservableObject [ObservableProperty] private int _pollingInterval; - public VariableItemViewModel() + public VariableItem() { } diff --git a/DMS.WPF/ViewModels/Items/VariableTableItemViewModel.cs b/DMS.WPF/ItemViewModel/VariableTableItem.cs similarity index 70% rename from DMS.WPF/ViewModels/Items/VariableTableItemViewModel.cs rename to DMS.WPF/ItemViewModel/VariableTableItem.cs index eef5fef..fdbfc16 100644 --- a/DMS.WPF/ViewModels/Items/VariableTableItemViewModel.cs +++ b/DMS.WPF/ItemViewModel/VariableTableItem.cs @@ -4,9 +4,9 @@ using DMS.Core.Enums; using System.Collections.ObjectModel; using System.Linq; -namespace DMS.WPF.ViewModels.Items; +namespace DMS.WPF.ItemViewModel; -public partial class VariableTableItemViewModel : ObservableObject +public partial class VariableTableItem : ObservableObject { public int Id { get; set; } @@ -23,13 +23,13 @@ public partial class VariableTableItemViewModel : ObservableObject private int _deviceId; [ObservableProperty] - private DeviceItemViewModel _device; + private DeviceItem _device; [ObservableProperty] private ProtocolType _protocol; [ObservableProperty] - private ObservableCollection _variables = new(); + private ObservableCollection _variables = new(); } diff --git a/DMS.WPF/Profiles/MappingProfile.cs b/DMS.WPF/Profiles/MappingProfile.cs index de737b8..84dfe8b 100644 --- a/DMS.WPF/Profiles/MappingProfile.cs +++ b/DMS.WPF/Profiles/MappingProfile.cs @@ -2,7 +2,8 @@ using AutoMapper; using DMS.Application.DTOs; using DMS.Core.Models; using DMS.Infrastructure.Models; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Profiles { @@ -10,29 +11,29 @@ namespace DMS.WPF.Profiles { public MappingProfile() { - CreateMap() + CreateMap() .ReverseMap(); - CreateMap() + CreateMap() .ReverseMap(); - CreateMap() + CreateMap() .ReverseMap(); - CreateMap(); + CreateMap(); CreateMap().ReverseMap(); - CreateMap() + CreateMap() .ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap() + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap() .ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/DMS.WPF/Services/DataEventService.cs b/DMS.WPF/Services/DataEventService.cs index a4b1bb6..94adb87 100644 --- a/DMS.WPF/Services/DataEventService.cs +++ b/DMS.WPF/Services/DataEventService.cs @@ -10,7 +10,7 @@ using DMS.Core.Events; using DMS.Core.Models; using DMS.Message; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using Microsoft.Extensions.Logging; namespace DMS.WPF.Services; diff --git a/DMS.WPF/Services/DataStorageService.cs b/DMS.WPF/Services/DataStorageService.cs index e24270d..5f7c9e3 100644 --- a/DMS.WPF/Services/DataStorageService.cs +++ b/DMS.WPF/Services/DataStorageService.cs @@ -1,6 +1,7 @@ using System.Collections.ObjectModel; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; +using DMS.WPF.ItemViewModel; using ObservableCollections; namespace DMS.WPF.Services; @@ -12,54 +13,54 @@ public class DataStorageService : IDataStorageService /// /// 设备列表。 /// - public ObservableDictionary Devices { get; set; } + public ObservableDictionary Devices { get; set; } /// /// 设备列表。 /// - public new ObservableDictionary VariableTables { get; set; } + public new ObservableDictionary VariableTables { get; set; } /// /// 变量数据列表。 /// - public ObservableDictionary Variables { get; set; } + public ObservableDictionary Variables { get; set; } /// /// MQTT服务器列表。 /// - public ObservableDictionary MqttServers { get; set; } + public ObservableDictionary MqttServers { get; set; } /// /// 菜单列表。 /// - public ObservableCollection Menus { get; set; } + public ObservableCollection Menus { get; set; } /// /// 菜单树列表。 /// - public ObservableCollection MenuTrees { get; set; } + public ObservableCollection MenuTrees { get; set; } /// /// 日志列表。 /// - public ObservableCollection Nlogs { get; set; } + public ObservableCollection Nlogs { get; set; } /// /// 触发器列表。 /// - public ObservableDictionary Triggers { get; set; } + public ObservableDictionary Triggers { get; set; } public DataStorageService() { - Devices=new ObservableDictionary(); - VariableTables = new ObservableDictionary(); - Variables=new ObservableDictionary(); - MqttServers=new ObservableDictionary(); - Menus=new ObservableCollection(); - MenuTrees=new ObservableCollection(); - Nlogs=new ObservableCollection(); - Triggers = new ObservableDictionary(); + Devices=new ObservableDictionary(); + VariableTables = new ObservableDictionary(); + Variables=new ObservableDictionary(); + MqttServers=new ObservableDictionary(); + Menus=new ObservableCollection(); + MenuTrees=new ObservableCollection(); + Nlogs=new ObservableCollection(); + Triggers = new ObservableDictionary(); } diff --git a/DMS.WPF/Services/DeviceDataService.cs b/DMS.WPF/Services/DeviceDataService.cs index 5459da4..741c48e 100644 --- a/DMS.WPF/Services/DeviceDataService.cs +++ b/DMS.WPF/Services/DeviceDataService.cs @@ -8,7 +8,7 @@ using DMS.Application.Interfaces; using DMS.Core.Enums; using DMS.Core.Events; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Services; @@ -60,7 +60,7 @@ public class DeviceDataService : IDeviceDataService _uiDispatcher.Invoke(() => { - if (_dataStorageService.Devices.TryGetValue(e.DeviceId, out DeviceItemViewModel device)) + if (_dataStorageService.Devices.TryGetValue(e.DeviceId, out DeviceItem device)) { device.IsRunning = e.StateValue; @@ -84,7 +84,7 @@ public class DeviceDataService : IDeviceDataService { foreach (var deviceDto in _appDataStorageService.Devices.Values) { - _dataStorageService.Devices.Add(deviceDto.Id, _mapper.Map(deviceDto)); + _dataStorageService.Devices.Add(deviceDto.Id, _mapper.Map(deviceDto)); } } @@ -106,12 +106,12 @@ public class DeviceDataService : IDeviceDataService } //给界面添加设备 - _dataStorageService.Devices.Add(addDto.Device.Id, _mapper.Map(addDto.Device)); + _dataStorageService.Devices.Add(addDto.Device.Id, _mapper.Map(addDto.Device)); // 给界面添加设备菜单 if (addDto.DeviceMenu != null) { - _menuDataService.AddMenuItem(_mapper.Map(addDto.DeviceMenu)); + _menuDataService.AddMenuItem(_mapper.Map(addDto.DeviceMenu)); } @@ -124,7 +124,7 @@ public class DeviceDataService : IDeviceDataService if (addDto.VariableTable != null && addDto.VariableTableMenu != null) { - _menuDataService.AddMenuItem(_mapper.Map(addDto.VariableTableMenu)); + _menuDataService.AddMenuItem(_mapper.Map(addDto.VariableTableMenu)); } @@ -138,7 +138,7 @@ public class DeviceDataService : IDeviceDataService /// /// 删除设备。 /// - public async Task DeleteDevice(DeviceItemViewModel device) + public async Task DeleteDevice(DeviceItem device) { //从数据库和内存中删除设备相关数据 @@ -169,7 +169,7 @@ public class DeviceDataService : IDeviceDataService /// /// 更新设备。 /// - public async Task UpdateDevice(DeviceItemViewModel device) + public async Task UpdateDevice(DeviceItem device) { if (!_appDataStorageService.Devices.TryGetValue(device.Id, out var deviceDto)) { diff --git a/DMS.WPF/Services/LogDataService.cs b/DMS.WPF/Services/LogDataService.cs index 8958f5b..171ebd2 100644 --- a/DMS.WPF/Services/LogDataService.cs +++ b/DMS.WPF/Services/LogDataService.cs @@ -6,7 +6,7 @@ using DMS.Application.Events; using DMS.Application.Interfaces; using DMS.Core.Enums; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Services; @@ -36,7 +36,7 @@ public class LogDataService : ILogDataService public void LoadAllLog() { // 加载日志数据 - _dataStorageService.Nlogs = _mapper.Map>(_appDataStorageService.Nlogs.Values); + _dataStorageService.Nlogs = _mapper.Map>(_appDataStorageService.Nlogs.Values); } /// @@ -50,7 +50,7 @@ public class LogDataService : ILogDataService switch (e.ChangeType) { case DataChangeType.Added: - _dataStorageService.Nlogs.Add(_mapper.Map(e.Nlog)); + _dataStorageService.Nlogs.Add(_mapper.Map(e.Nlog)); break; case DataChangeType.Updated: var existingLog = _dataStorageService.Nlogs.FirstOrDefault(l => l.Id == e.Nlog.Id); diff --git a/DMS.WPF/Services/MenuDataService.cs b/DMS.WPF/Services/MenuDataService.cs index 2e56858..2bba572 100644 --- a/DMS.WPF/Services/MenuDataService.cs +++ b/DMS.WPF/Services/MenuDataService.cs @@ -4,7 +4,7 @@ using DMS.Application.Interfaces; using DMS.Application.Interfaces.Management; using DMS.Application.Services.Management; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using System.Collections.ObjectModel; using System.Threading.Tasks; @@ -37,7 +37,7 @@ public class MenuDataService : IMenuDataService public void LoadAllMenus() { - _dataStorageService.Menus = _mapper.Map>(_appDataStorageService.Menus.Values); + _dataStorageService.Menus = _mapper.Map>(_appDataStorageService.Menus.Values); BuildMenuTrees(); } @@ -71,20 +71,20 @@ public class MenuDataService : IMenuDataService /// /// 添加菜单项。 /// - public async Task AddMenuItem(MenuItemViewModel menuItemViewModel) + public async Task AddMenuItem(MenuItem MenuItem) { - if (menuItemViewModel is null) return; + if (MenuItem is null) return; - var deviceMenu = _dataStorageService.Menus.FirstOrDefault(m => m.Id == menuItemViewModel.ParentId); + var deviceMenu = _dataStorageService.Menus.FirstOrDefault(m => m.Id == MenuItem.ParentId); if (deviceMenu is not null) { - var menuId= await _menuManagementService.CreateMenuAsync(_mapper.Map(menuItemViewModel)); + var menuId= await _menuManagementService.CreateMenuAsync(_mapper.Map(MenuItem)); if (menuId>0) { - menuItemViewModel.Id = menuId; - deviceMenu.Children.Add(menuItemViewModel); - _dataStorageService.Menus.Add(menuItemViewModel); + MenuItem.Id = menuId; + deviceMenu.Children.Add(MenuItem); + _dataStorageService.Menus.Add(MenuItem); BuildMenuTrees(); } @@ -95,26 +95,26 @@ public class MenuDataService : IMenuDataService /// /// 删除菜单项。 /// - public async Task DeleteMenuItem(MenuItemViewModel? menuItemViewModel) + public async Task DeleteMenuItem(MenuItem? MenuItem) { - if (menuItemViewModel is null) return; + if (MenuItem is null) return; - await _menuManagementService.DeleteMenuAsync(menuItemViewModel.Id); + await _menuManagementService.DeleteMenuAsync(MenuItem.Id); // 从扁平菜单列表中移除 - _dataStorageService.Menus.Remove(menuItemViewModel); + _dataStorageService.Menus.Remove(MenuItem); //// 从树形结构中移除 - if (menuItemViewModel.ParentId.HasValue && menuItemViewModel.ParentId.Value != 0) + if (MenuItem.ParentId.HasValue && MenuItem.ParentId.Value != 0) { // 如果有父菜单,从父菜单的Children中移除 - var parentMenu = _dataStorageService.Menus.FirstOrDefault(m => m.Id == menuItemViewModel.ParentId.Value); - parentMenu?.Children.Remove(menuItemViewModel); + var parentMenu = _dataStorageService.Menus.FirstOrDefault(m => m.Id == MenuItem.ParentId.Value); + parentMenu?.Children.Remove(MenuItem); } else { // 如果是根菜单,从MenuTrees中移除 - _dataStorageService.MenuTrees.Remove(menuItemViewModel); + _dataStorageService.MenuTrees.Remove(MenuItem); } //BuildMenuTrees(); diff --git a/DMS.WPF/Services/MqttDataService.cs b/DMS.WPF/Services/MqttDataService.cs index e54f776..753bd38 100644 --- a/DMS.WPF/Services/MqttDataService.cs +++ b/DMS.WPF/Services/MqttDataService.cs @@ -5,7 +5,7 @@ using DMS.Application.Interfaces.Management; using DMS.Core.Enums; using DMS.WPF.Interfaces; using DMS.WPF.ViewModels; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Services; @@ -47,7 +47,7 @@ public class MqttDataService : IMqttDataService // 加载MQTT服务器数据 foreach (var mqttServerDto in _appDataStorageService.MqttServers.Values) { - _dataStorageService.MqttServers.TryAdd(mqttServerDto.Id, _mapper.Map(mqttServerDto)); + _dataStorageService.MqttServers.TryAdd(mqttServerDto.Id, _mapper.Map(mqttServerDto)); } } @@ -62,12 +62,12 @@ public class MqttDataService : IMqttDataService /// /// 添加MQTT服务器。 /// - public async Task AddMqttServer(MqttServerItemViewModel mqttServer) + public async Task AddMqttServer(MqttServerItem mqttServer) { var addMqttServerDto = await _mqttManagementService.CreateMqttServerAsync(_mapper.Map(mqttServer)); - MqttServerItemViewModel mqttServerItem = _mapper.Map(addMqttServerDto); + MqttServerItem mqttServerItem = _mapper.Map(addMqttServerDto); _dataStorageService.MqttServers.Add(mqttServerItem.Id, mqttServerItem); @@ -85,7 +85,7 @@ public class MqttDataService : IMqttDataService MenuType = MenuType.MqttServerMenu, TargetViewKey = nameof(MqttServerDetailViewModel), }; - await _menuDataService.AddMenuItem(_mapper.Map(mqttServerMenu)); + await _menuDataService.AddMenuItem(_mapper.Map(mqttServerMenu)); } return mqttServerItem; @@ -94,7 +94,7 @@ public class MqttDataService : IMqttDataService /// /// 更新MQTT服务器。 /// - public async Task UpdateMqttServer(MqttServerItemViewModel mqttServer) + public async Task UpdateMqttServer(MqttServerItem mqttServer) { var dto = _mapper.Map(mqttServer); var result = await _mqttManagementService.UpdateMqttServerAsync(dto); @@ -120,7 +120,7 @@ public class MqttDataService : IMqttDataService /// /// 删除MQTT服务器。 /// - public async Task DeleteMqttServer(MqttServerItemViewModel mqttServer) + public async Task DeleteMqttServer(MqttServerItem mqttServer) { // 从数据库和内存中删除MQTT服务器 var result = await _mqttManagementService.DeleteMqttServerAsync(mqttServer.Id); diff --git a/DMS.WPF/Services/NavigationService.cs b/DMS.WPF/Services/NavigationService.cs index 9d07c2e..2188ff5 100644 --- a/DMS.WPF/Services/NavigationService.cs +++ b/DMS.WPF/Services/NavigationService.cs @@ -1,7 +1,7 @@ using DMS.Core.Models; using DMS.WPF.Interfaces; using DMS.WPF.ViewModels; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using DMS.WPF.Views; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; diff --git a/DMS.WPF/Services/TriggerDataService.cs b/DMS.WPF/Services/TriggerDataService.cs index 28f543c..045f3da 100644 --- a/DMS.WPF/Services/TriggerDataService.cs +++ b/DMS.WPF/Services/TriggerDataService.cs @@ -4,7 +4,7 @@ using DMS.Application.DTOs; using DMS.Application.Interfaces; using DMS.Core.Events; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using Opc.Ua; namespace DMS.WPF.Services; @@ -51,14 +51,14 @@ public class TriggerDataService : ITriggerDataService { foreach (var triggerDto in _appDataStorageService.Triggers.Values) { - _dataStorageService.Triggers.Add(triggerDto.Id, _mapper.Map(triggerDto)); + _dataStorageService.Triggers.Add(triggerDto.Id, _mapper.Map(triggerDto)); } } /// /// 添加触发器。 /// - public async Task AddTrigger(TriggerItemViewModel dto) + public async Task AddTrigger(TriggerItem dto) { // 添加null检查 if (dto == null) @@ -75,7 +75,7 @@ public class TriggerDataService : ITriggerDataService } // 给界面添加触发器 - var addItem = _mapper.Map(addDto); + var addItem = _mapper.Map(addDto); _dataStorageService.Triggers.Add(addDto.Id, addItem); return addItem; @@ -84,7 +84,7 @@ public class TriggerDataService : ITriggerDataService /// /// 删除触发器。 /// - public async Task DeleteTrigger(TriggerItemViewModel trigger) + public async Task DeleteTrigger(TriggerItem trigger) { // 从数据库删除触发器数据 if (!await _appDataCenterService.TriggerManagementService.DeleteTriggerAsync(trigger.Id)) @@ -101,7 +101,7 @@ public class TriggerDataService : ITriggerDataService /// /// 更新触发器。 /// - public async Task UpdateTrigger(TriggerItemViewModel trigger) + public async Task UpdateTrigger(TriggerItem trigger) { if (!_appDataStorageService.Triggers.TryGetValue(trigger.Id, out var triggerDto)) { diff --git a/DMS.WPF/Services/VariableDataService.cs b/DMS.WPF/Services/VariableDataService.cs index 2a9deab..9168e7f 100644 --- a/DMS.WPF/Services/VariableDataService.cs +++ b/DMS.WPF/Services/VariableDataService.cs @@ -4,7 +4,7 @@ using DMS.Application.DTOs; using DMS.Application.Interfaces; using DMS.Core.Models; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using System.Collections.ObjectModel; using DMS.Application.Services.Management; @@ -64,7 +64,7 @@ public class VariableDataService : IVariableDataService if (_dataStorageService.Devices.TryGetValue(tableDto.DeviceId, out var device)) { - var variableTableItem = _mapper.Map(tableDto); + var variableTableItem = _mapper.Map(tableDto); device.VariableTables.Add(variableTableItem); _dataStorageService.VariableTables.TryAdd(variableTableItem.Id,variableTableItem); } @@ -76,7 +76,7 @@ public class VariableDataService : IVariableDataService /// /// 更新变量表。 /// - public async Task UpdateVariableTable(VariableTableItemViewModel variableTable) + public async Task UpdateVariableTable(VariableTableItem variableTable) { if (variableTable == null) { @@ -96,7 +96,7 @@ public class VariableDataService : IVariableDataService /// /// 删除变量表。 /// - public async Task DeleteVariableTable(VariableTableItemViewModel variableTable, bool isDeleteDb = false) + public async Task DeleteVariableTable(VariableTableItem variableTable, bool isDeleteDb = false) { if (variableTable == null) { @@ -126,7 +126,7 @@ public class VariableDataService : IVariableDataService /// /// 添加变量。 /// - public void AddVariable(VariableItemViewModel variableItem) + public void AddVariable(VariableItem variableItem) { if (variableItem == null) { diff --git a/DMS.WPF/Services/VariableTableDataService.cs b/DMS.WPF/Services/VariableTableDataService.cs index 3b4dbef..7082066 100644 --- a/DMS.WPF/Services/VariableTableDataService.cs +++ b/DMS.WPF/Services/VariableTableDataService.cs @@ -4,7 +4,7 @@ using DMS.Application.DTOs; using DMS.Application.Interfaces; using DMS.Core.Enums; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Services; @@ -52,7 +52,7 @@ public class VariableTableDataService : IVariableTableDataService createDto.Menu = menuDto; var resDto = await _appDataCenterService.VariableTableManagementService.CreateVariableTableAsync(createDto); - _menuDataService.AddMenuItem(_mapper.Map(resDto.Menu)); + _menuDataService.AddMenuItem(_mapper.Map(resDto.Menu)); return resDto.VariableTable.Id; } @@ -62,7 +62,7 @@ public class VariableTableDataService : IVariableTableDataService } - public async Task UpdateVariableTable(VariableTableItemViewModel variableTable) + public async Task UpdateVariableTable(VariableTableItem variableTable) { if (variableTable == null) { @@ -88,7 +88,7 @@ public class VariableTableDataService : IVariableTableDataService return false; } - public async Task DeleteVariableTable(VariableTableItemViewModel variableTable, bool isDeleteDb = false) + public async Task DeleteVariableTable(VariableTableItem variableTable, bool isDeleteDb = false) { if (variableTable == null) { diff --git a/DMS.WPF/Services/WPFDataService.cs b/DMS.WPF/Services/WPFDataService.cs index 1e066a0..8e0464a 100644 --- a/DMS.WPF/Services/WPFDataService.cs +++ b/DMS.WPF/Services/WPFDataService.cs @@ -2,7 +2,7 @@ using System.Collections.ObjectModel; using AutoMapper; using DMS.Application.Interfaces; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Services; diff --git a/DMS.WPF/ViewModels/DeviceDetailViewModel.cs b/DMS.WPF/ViewModels/DeviceDetailViewModel.cs index 56b98d2..179ceb1 100644 --- a/DMS.WPF/ViewModels/DeviceDetailViewModel.cs +++ b/DMS.WPF/ViewModels/DeviceDetailViewModel.cs @@ -10,7 +10,7 @@ using DMS.WPF.Services; using DMS.Services; using DMS.WPF.Interfaces; using DMS.WPF.ViewModels.Dialogs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using iNKORE.UI.WPF.Modern.Common.IconKeys; using Microsoft.Extensions.DependencyInjection; @@ -25,10 +25,10 @@ public partial class DeviceDetailViewModel : ViewModelBase private readonly IWPFDataService _wpfDataService; [ObservableProperty] - private DeviceItemViewModel _currentDevice; + private DeviceItem _currentDevice; [ObservableProperty] - private VariableTableItemViewModel _selectedVariableTable; + private VariableTableItem _selectedVariableTable; [ObservableProperty] private bool _isBusy; @@ -60,35 +60,35 @@ public partial class DeviceDetailViewModel : ViewModelBase PrimaryButText = "添加变量表" }; // 1. 显示添加设备对话框 - var variableTableItemViewModel = await _dialogService.ShowDialogAsync(variableTableDialogViewModel); + var VariableTableItem = await _dialogService.ShowDialogAsync(variableTableDialogViewModel); // 如果用户取消或对话框未返回设备,则直接返回 - if (variableTableItemViewModel == null) + if (VariableTableItem == null) { return; } - variableTableItemViewModel.DeviceId = CurrentDevice.Id; + VariableTableItem.DeviceId = CurrentDevice.Id; var tableMenu = new MenuBeanDto() { - Header = variableTableItemViewModel.Name, + Header = VariableTableItem.Name, Icon = SegoeFluentIcons.DataSense.Glyph, TargetViewKey = nameof(VariableTableViewModel) }; int addVarTableId = await _wpfDataService.VariableTableDataService.AddVariableTable( - _mapper.Map(variableTableItemViewModel), + _mapper.Map(VariableTableItem), tableMenu, true); if (addVarTableId > 0) { - variableTableItemViewModel.Id = addVarTableId; - variableTableItemViewModel.Device = CurrentDevice; - CurrentDevice.VariableTables.Add(variableTableItemViewModel); - _dataStorageService.VariableTables.Add(variableTableItemViewModel.Id, variableTableItemViewModel); - _notificationService.ShowSuccess($"添加变量表成功:{variableTableItemViewModel.Name}"); + VariableTableItem.Id = addVarTableId; + VariableTableItem.Device = CurrentDevice; + CurrentDevice.VariableTables.Add(VariableTableItem); + _dataStorageService.VariableTables.Add(VariableTableItem.Id, VariableTableItem); + _notificationService.ShowSuccess($"添加变量表成功:{VariableTableItem.Name}"); } else { - _notificationService.ShowError($"添加变量表失败:{variableTableItemViewModel.Name}!!"); + _notificationService.ShowError($"添加变量表失败:{VariableTableItem.Name}!!"); } } catch (Exception ex) @@ -120,7 +120,7 @@ public partial class DeviceDetailViewModel : ViewModelBase PrimaryButText = "编辑变量表" }; // 1. 显示变量表对话框 - VariableTableItemViewModel variableTable + VariableTableItem variableTable = await _dialogService.ShowDialogAsync(variableTableDialogViewModel); // 如果用户取消或对话框未返回变量表,则直接返回 if (variableTable == null) diff --git a/DMS.WPF/ViewModels/DevicesViewModel.cs b/DMS.WPF/ViewModels/DevicesViewModel.cs index 85bfc39..3b9d130 100644 --- a/DMS.WPF/ViewModels/DevicesViewModel.cs +++ b/DMS.WPF/ViewModels/DevicesViewModel.cs @@ -10,7 +10,7 @@ using DMS.Core.Models; using DMS.WPF.Interfaces; using DMS.WPF.Services; using DMS.WPF.ViewModels.Dialogs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using iNKORE.UI.WPF.Modern.Common.IconKeys; using ObservableCollections; @@ -33,14 +33,14 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable /// 设备列表。 /// [ObservableProperty] - private INotifyCollectionChangedSynchronizedViewList _devices; + private INotifyCollectionChangedSynchronizedViewList _devices; /// /// 当前选中的设备。 /// [ObservableProperty] - private DeviceItemViewModel _selectedDevice; + private DeviceItem _selectedDevice; private readonly INotificationService _notificationService; @@ -79,7 +79,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable try { // 1. 显示添加设备对话框 - DeviceItemViewModel device = await _dialogService.ShowDialogAsync(new DeviceDialogViewModel() + DeviceItem device = await _dialogService.ShowDialogAsync(new DeviceDialogViewModel() { Title = "添加设备", PrimaryButText = "添加设备" @@ -165,7 +165,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable /// 删除设备命令。 /// [RelayCommand] - private async Task DeleteDevice(DeviceItemViewModel parmDeviceItem) + private async Task DeleteDevice(DeviceItem parmDeviceItem) { try { @@ -199,7 +199,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable /// 编辑设备命令。 /// [RelayCommand] - private async Task EditDevice(DeviceItemViewModel parmDeviceItem) + private async Task EditDevice(DeviceItem parmDeviceItem) { try { @@ -219,7 +219,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable PrimaryButText = "编辑设备" }; // 1. 显示设备对话框 - DeviceItemViewModel device = await _dialogService.ShowDialogAsync(deviceDialogViewModel); + DeviceItem device = await _dialogService.ShowDialogAsync(deviceDialogViewModel); // 如果用户取消或对话框未返回设备,则直接返回 if (device == null) { @@ -247,7 +247,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable [RelayCommand] - private async Task AddVariableTable(DeviceItemViewModel device) + private async Task AddVariableTable(DeviceItem device) { if (device == null) return; @@ -258,38 +258,38 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable PrimaryButText = "添加变量表" }; // 显示添加变量表对话框 - var variableTableItemViewModel = await _dialogService.ShowDialogAsync(variableTableDialogViewModel); + var VariableTableItem = await _dialogService.ShowDialogAsync(variableTableDialogViewModel); // 如果用户取消或对话框未返回变量表,则直接返回 - if (variableTableItemViewModel == null) + if (VariableTableItem == null) { return; } - variableTableItemViewModel.DeviceId = device.Id; + VariableTableItem.DeviceId = device.Id; var tableMenu = new MenuBeanDto() { - Header = variableTableItemViewModel.Name, + Header = VariableTableItem.Name, Icon = SegoeFluentIcons.DataSense.Glyph, TargetViewKey = nameof(VariableTableViewModel) }; int addVarTableId = await _wpfDataService.VariableTableDataService.AddVariableTable( - _mapper.Map(variableTableItemViewModel), + _mapper.Map(VariableTableItem), tableMenu, true); if (addVarTableId > 0) { - variableTableItemViewModel.Id = addVarTableId; - if (_dataStorageService.Devices.TryGetValue(variableTableItemViewModel.DeviceId, out var deviceModel)) + VariableTableItem.Id = addVarTableId; + if (_dataStorageService.Devices.TryGetValue(VariableTableItem.DeviceId, out var deviceModel)) { - variableTableItemViewModel.Device = deviceModel; - deviceModel.VariableTables.Add(variableTableItemViewModel); - _dataStorageService.VariableTables.Add(variableTableItemViewModel.Id, variableTableItemViewModel); + VariableTableItem.Device = deviceModel; + deviceModel.VariableTables.Add(VariableTableItem); + _dataStorageService.VariableTables.Add(VariableTableItem.Id, VariableTableItem); } - _notificationService.ShowSuccess($"添加变量表成功:{variableTableItemViewModel.Name}"); + _notificationService.ShowSuccess($"添加变量表成功:{VariableTableItem.Name}"); } else { - _notificationService.ShowError($"添加变量表失败:{variableTableItemViewModel.Name}!!"); + _notificationService.ShowError($"添加变量表失败:{VariableTableItem.Name}!!"); } } catch (Exception ex) @@ -299,7 +299,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable } [RelayCommand] - private async Task EditVariableTable(VariableTableItemViewModel variableTable) + private async Task EditVariableTable(VariableTableItem variableTable) { if (variableTable == null) { @@ -315,7 +315,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable PrimaryButText = "编辑变量表" }; // 显示变量表对话框 - VariableTableItemViewModel updatedVariableTable + VariableTableItem updatedVariableTable = await _dialogService.ShowDialogAsync(variableTableDialogViewModel); // 如果用户取消或对话框未返回变量表,则直接返回 if (updatedVariableTable == null) @@ -344,7 +344,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable } [RelayCommand] - private async Task DeleteVariableTable(VariableTableItemViewModel variableTable) + private async Task DeleteVariableTable(VariableTableItem variableTable) { if (variableTable == null) { @@ -388,7 +388,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable private void OnDeviceIsActiveChanged(object? sender, bool isActive) { - if (sender is DeviceItemViewModel deviceItemViewModel) + if (sender is DeviceItem DeviceItem) { } } diff --git a/DMS.WPF/ViewModels/Dialogs/DeviceDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/DeviceDialogViewModel.cs index 4fb9498..32898ec 100644 --- a/DMS.WPF/ViewModels/Dialogs/DeviceDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/DeviceDialogViewModel.cs @@ -1,23 +1,23 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using System.Threading.Tasks; namespace DMS.WPF.ViewModels.Dialogs; -public partial class DeviceDialogViewModel : DialogViewModelBase +public partial class DeviceDialogViewModel : DialogViewModelBase { [ObservableProperty] private bool _isAddMode; [ObservableProperty] - private DeviceItemViewModel _device; + private DeviceItem _device; - public DeviceDialogViewModel(DeviceItemViewModel device=null) + public DeviceDialogViewModel(DeviceItem device=null) { if (device==null) { - _device = new DeviceItemViewModel(); + _device = new DeviceItem(); IsAddMode=true; } else diff --git a/DMS.WPF/ViewModels/Dialogs/ImportExcelDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/ImportExcelDialogViewModel.cs index d4f0ba4..c596f42 100644 --- a/DMS.WPF/ViewModels/Dialogs/ImportExcelDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/ImportExcelDialogViewModel.cs @@ -8,7 +8,7 @@ using DMS.Core.Interfaces.Services; using DMS.Core.Models; using DMS.WPF.Interfaces; using DMS.WPF.Services; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.ViewModels.Dialogs; @@ -25,7 +25,7 @@ public partial class ImportExcelDialogViewModel : DialogViewModelBase _variables = new(); [ObservableProperty] - private ObservableCollection _variableItemViewModels ; + private ObservableCollection _variableItemViewModels ; [ObservableProperty] private IList _selectedVariables = new ArrayList(); @@ -48,7 +48,7 @@ public partial class ImportExcelDialogViewModel : DialogViewModelBase(_mapper.Map>(Variables)); + VariableItemViewModels=new ObservableCollection(_mapper.Map>(Variables)); } catch (System.Exception ex) { @@ -65,7 +65,7 @@ public partial class ImportExcelDialogViewModel : DialogViewModelBase().ToList(); + var selected = SelectedVariables.Cast().ToList(); Close(_mapper.Map>(selected)); } diff --git a/DMS.WPF/ViewModels/Dialogs/ImportOpcUaDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/ImportOpcUaDialogViewModel.cs index 77bc692..45e28d7 100644 --- a/DMS.WPF/ViewModels/Dialogs/ImportOpcUaDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/ImportOpcUaDialogViewModel.cs @@ -9,7 +9,7 @@ using DMS.Infrastructure.Models; using DMS.WPF.Factories; using DMS.WPF.Interfaces; using DMS.WPF.Services; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using Opc.Ua; using Opc.Ua.Client; @@ -19,7 +19,7 @@ namespace DMS.WPF.ViewModels.Dialogs; /// OPC UA导入对话框的视图模型 /// 负责处理OPC UA服务器连接、节点浏览和变量导入等功能 /// -public partial class ImportOpcUaDialogViewModel : DialogViewModelBase>, IDisposable +public partial class ImportOpcUaDialogViewModel : DialogViewModelBase>, IDisposable { /// /// OPC UA服务器端点URL @@ -31,13 +31,13 @@ public partial class ImportOpcUaDialogViewModel : DialogViewModelBase [ObservableProperty] - private OpcUaNodeItemViewModel _rootOpcUaNode; + private OpcUaNodeItem _rootOpcUaNode; /// /// 当前选中节点下的所有变量集合 /// [ObservableProperty] - private ObservableCollection _opcUaNodeVariables = new(); + private ObservableCollection _opcUaNodeVariables = new(); /// /// 用户选择的变量列表 @@ -74,7 +74,7 @@ public partial class ImportOpcUaDialogViewModel : DialogViewModelBase [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(FindCurrentNodeVariablesCommand))] // 当选中节点改变时通知查找变量命令更新可执行状态 - private OpcUaNodeItemViewModel _selectedNode; + private OpcUaNodeItem _selectedNode; /// /// OPC UA服务接口实例 @@ -112,7 +112,7 @@ public partial class ImportOpcUaDialogViewModel : DialogViewModelBase(RootOpcUaNode)); - RootOpcUaNode.Children = _mapper.Map>(children); + RootOpcUaNode.Children = _mapper.Map>(children); } } // 处理特定异常类型提供更友好的用户提示 @@ -188,7 +188,7 @@ public partial class ImportOpcUaDialogViewModel : DialogViewModelBase().ToList()); + Close(SelectedVariables.Cast().ToList()); } catch (Exception ex) { @@ -277,7 +277,7 @@ public partial class ImportOpcUaDialogViewModel : DialogViewModelBase /// 要加载变量的OPC UA节点 - public async Task LoadNodeVariables(OpcUaNodeItemViewModel node) + public async Task LoadNodeVariables(OpcUaNodeItem node) { try { @@ -311,7 +311,7 @@ public partial class ImportOpcUaDialogViewModel : DialogViewModelBase /// 要浏览的节点 /// 是否递归浏览子节点 - private async Task BrowseNodeVariablesAsync(OpcUaNodeItemViewModel node, bool isRecursive = false) + private async Task BrowseNodeVariablesAsync(OpcUaNodeItem node, bool isRecursive = false) { // 参数有效性检查 if (node == null) return; @@ -331,7 +331,7 @@ public partial class ImportOpcUaDialogViewModel : DialogViewModelBase(child); + var nodeItem = _mapper.Map(child); // 判断节点类型是否为变量 if (child.NodeClass == NodeClass.Variable) diff --git a/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs index d76e15d..150fdd8 100644 --- a/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/MqttAliasBatchEditDialogViewModel.cs @@ -1,7 +1,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using DMS.Application.DTOs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -19,11 +19,11 @@ namespace DMS.WPF.ViewModels.Dialogs private ObservableCollection _variableMqttAliases = new(); [ObservableProperty] - private MqttServerItemViewModel _selectedMqttServer; + private MqttServerItem _selectedMqttServer; public MqttAliasBatchEditDialogViewModel( - List variables, - MqttServerItemViewModel mqttServer) + List variables, + MqttServerItem mqttServer) { _selectedMqttServer = mqttServer; InitializeVariableMqttAliases(variables); @@ -32,7 +32,7 @@ namespace DMS.WPF.ViewModels.Dialogs /// /// 初始化变量MQTT别名列表 /// - private void InitializeVariableMqttAliases(List variables) + private void InitializeVariableMqttAliases(List variables) { VariableMqttAliases.Clear(); @@ -58,7 +58,7 @@ namespace DMS.WPF.ViewModels.Dialogs /// /// 生成默认别名 /// - private string GenerateDefaultAlias(VariableItemViewModel variable) + private string GenerateDefaultAlias(VariableItem variable) { // 可以根据需要自定义默认别名生成逻辑 return $"{variable.Name}"; diff --git a/DMS.WPF/ViewModels/Dialogs/MqttDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/MqttDialogViewModel.cs index 30458bd..1fca11f 100644 --- a/DMS.WPF/ViewModels/Dialogs/MqttDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/MqttDialogViewModel.cs @@ -1,13 +1,13 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.ViewModels.Dialogs; -public partial class MqttDialogViewModel : DialogViewModelBase +public partial class MqttDialogViewModel : DialogViewModelBase { [ObservableProperty] - private MqttServerItemViewModel _mqttServer; + private MqttServerItem _mqttServer; [ObservableProperty] private string _title; @@ -17,12 +17,12 @@ public partial class MqttDialogViewModel : DialogViewModelBase /// MQTT服务器选择对话框的视图模型 /// - public partial class MqttSelectionDialogViewModel : DialogViewModelBase + public partial class MqttSelectionDialogViewModel : DialogViewModelBase { private readonly IMqttAppService _mqttAppService; [ObservableProperty] - private ObservableCollection _mqttServers = new(); + private ObservableCollection _mqttServers = new(); [ObservableProperty] - private MqttServerItemViewModel _selectedMqttServer; + private MqttServerItem _selectedMqttServer; public MqttSelectionDialogViewModel(IMqttAppService mqttAppService) { @@ -41,7 +41,7 @@ namespace DMS.WPF.ViewModels.Dialogs foreach (var dto in mqttServerDtos) { - MqttServers.Add(new MqttServerItemViewModel + MqttServers.Add(new MqttServerItem { Id = dto.Id, ServerName = dto.ServerName, diff --git a/DMS.WPF/ViewModels/Dialogs/TriggerDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/TriggerDialogViewModel.cs index 510db63..e4ca98f 100644 --- a/DMS.WPF/ViewModels/Dialogs/TriggerDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/TriggerDialogViewModel.cs @@ -10,14 +10,14 @@ using DMS.Application.Interfaces.Database; using DMS.Core.Interfaces; using DMS.Core.Models.Triggers; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.ViewModels.Dialogs { /// /// 触发器编辑器视图模型 /// - public partial class TriggerDialogViewModel : DialogViewModelBase + public partial class TriggerDialogViewModel : DialogViewModelBase { private readonly IVariableAppService _variableAppService; // To populate variable selection dropdown private readonly IDialogService _dialogService; @@ -28,16 +28,16 @@ namespace DMS.WPF.ViewModels.Dialogs private string _searchText = ""; [ObservableProperty] - private TriggerItemViewModel _trigger = new(); + private TriggerItem _trigger = new(); [ObservableProperty] - private List _availableVariables = new(); + private List _availableVariables = new(); [ObservableProperty] - private ObservableCollection _selectedVariables = new(); + private ObservableCollection _selectedVariables = new(); [ObservableProperty] - private ObservableCollection _filteredVariables = new(); + private ObservableCollection _filteredVariables = new(); // Properties for easier binding in XAML for SendEmail action config [ObservableProperty] @@ -101,7 +101,7 @@ namespace DMS.WPF.ViewModels.Dialogs /// 将变量添加到选中列表 /// /// 要添加的变量 - public void AddVariable(VariableItemViewModel variable) + public void AddVariable(VariableItem variable) { if (!SelectedVariables.Contains(variable)) { @@ -114,7 +114,7 @@ namespace DMS.WPF.ViewModels.Dialogs /// 从选中列表中移除变量 /// /// 要移除的变量 - public void RemoveVariable(VariableItemViewModel variable) + public void RemoveVariable(VariableItem variable) { if (SelectedVariables.Contains(variable)) { @@ -129,7 +129,7 @@ namespace DMS.WPF.ViewModels.Dialogs /// 待编辑的触发器 DTO public async Task OnInitializedAsync(object? parameter) { - if (parameter is TriggerItemViewModel triggerItemViewModel) + if (parameter is TriggerItem triggerItemViewModel) { Trigger = triggerItemViewModel; Title = Trigger.Id == default(int) ? "新建触发器" : "编辑触发器"; @@ -187,13 +187,13 @@ namespace DMS.WPF.ViewModels.Dialogs try { // 使用数据存储服务中的变量列表 - AvailableVariables = new List(_dataStorageService.Variables.Select(kvp => kvp.Value)); + AvailableVariables = new List(_dataStorageService.Variables.Select(kvp => kvp.Value)); UpdateFilteredVariables(); } catch (Exception ex) { _notificationService.ShowError($"加载变量列表失败: {ex.Message}"); - AvailableVariables = new List(); + AvailableVariables = new List(); } } diff --git a/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs index 45c2818..ba4d860 100644 --- a/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs @@ -7,14 +7,14 @@ using DMS.Application.Interfaces.Database; using DMS.Core.Enums; using DMS.WPF.Interfaces; using DMS.WPF.Services; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.ViewModels.Dialogs; -public partial class VariableDialogViewModel : DialogViewModelBase +public partial class VariableDialogViewModel : DialogViewModelBase { [ObservableProperty] - private VariableItemViewModel _variable; + private VariableItem _variable; [ObservableProperty] private string _errorMessage = string.Empty; @@ -33,7 +33,7 @@ public partial class VariableDialogViewModel : DialogViewModelBase v.Value.Name == Variable.Name || (v.Value.Protocol == ProtocolType.S7 && v.Value.S7Address == Variable.S7Address) || (v.Value.Protocol == ProtocolType.OpcUa && v.Value.OpcUaNodeId == Variable.OpcUaNodeId)).Select(v=>v.Value).ToList(); - VariableItemViewModel existVariable = null; + VariableItem existVariable = null; if (IsAddModel) { existVariable = existVariables.FirstOrDefault(); diff --git a/DMS.WPF/ViewModels/Dialogs/VariableTableDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/VariableTableDialogViewModel.cs index 346ff81..88822ac 100644 --- a/DMS.WPF/ViewModels/Dialogs/VariableTableDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/VariableTableDialogViewModel.cs @@ -1,19 +1,19 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.ViewModels.Dialogs; -public partial class VariableTableDialogViewModel:DialogViewModelBase +public partial class VariableTableDialogViewModel:DialogViewModelBase { [ObservableProperty] - private VariableTableItemViewModel _variableTable; + private VariableTableItem _variableTable; - public VariableTableDialogViewModel(VariableTableItemViewModel variableTable=null) + public VariableTableDialogViewModel(VariableTableItem variableTable=null) { if (variableTable==null) { - VariableTable = new VariableTableItemViewModel(); + VariableTable = new VariableTableItem(); } else { diff --git a/DMS.WPF/ViewModels/LogHistoryViewModel.cs b/DMS.WPF/ViewModels/LogHistoryViewModel.cs index 28f2e31..adb1a8d 100644 --- a/DMS.WPF/ViewModels/LogHistoryViewModel.cs +++ b/DMS.WPF/ViewModels/LogHistoryViewModel.cs @@ -5,7 +5,6 @@ using DMS.Application.DTOs; using DMS.Application.Interfaces; using DMS.Core.Models; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; using ObservableCollections; using System.Collections; using System.Collections.Generic; @@ -19,6 +18,7 @@ using DMS.Application.Events; using DMS.WPF.Services; using DMS.Application.Interfaces.Database; using DMS.Core.Enums; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.ViewModels; @@ -33,7 +33,7 @@ partial class LogHistoryViewModel : ViewModelBase,IDisposable private readonly IAppDataCenterService _appDataCenterService; [ObservableProperty] - private NlogItemViewModel _selectedLog; + private NlogItem _selectedLog; [ObservableProperty] private IList _selectedLogs = new ArrayList(); @@ -44,9 +44,9 @@ partial class LogHistoryViewModel : ViewModelBase,IDisposable [ObservableProperty] private string _selectedLogLevel; - private readonly ObservableList _logItemList; - private readonly ISynchronizedView _synchronizedView; - public NotifyCollectionChangedSynchronizedViewList LogItemListView { get; } + private readonly ObservableList _logItemList; + private readonly ISynchronizedView _synchronizedView; + public NotifyCollectionChangedSynchronizedViewList LogItemListView { get; } public ObservableCollection LogLevels { get; } = new ObservableCollection { "Trace", "Debug", "Info", "Warn", "Error", "Fatal" }; @@ -61,7 +61,7 @@ partial class LogHistoryViewModel : ViewModelBase,IDisposable _wpfDataService = wpfDataService; _appDataCenterService = appDataCenterService; - _logItemList = new ObservableList(_dataStorageService.Nlogs); + _logItemList = new ObservableList(_dataStorageService.Nlogs); _synchronizedView = _logItemList.CreateView(v => v); LogItemListView = _synchronizedView.ToNotifyCollectionChanged(); @@ -81,7 +81,7 @@ partial class LogHistoryViewModel : ViewModelBase,IDisposable switch (e.ChangeType) { case DataChangeType.Added: - var newLogItem = new NlogItemViewModel(new Nlog + var newLogItem = new NlogItem(new Nlog { Id = e.Nlog.Id, LogTime = e.Nlog.LogTime, @@ -103,7 +103,7 @@ partial class LogHistoryViewModel : ViewModelBase,IDisposable var existingLog = _logItemList.FirstOrDefault(l => l.Id == e.Nlog.Id); if (existingLog != null) { - existingLog = new NlogItemViewModel(new Nlog + existingLog = new NlogItem(new Nlog { Id = e.Nlog.Id, LogTime = e.Nlog.LogTime, @@ -132,7 +132,7 @@ partial class LogHistoryViewModel : ViewModelBase,IDisposable })); } - private bool FilterLogs(NlogItemViewModel item) + private bool FilterLogs(NlogItem item) { // 搜索文本过滤 var searchTextLower = SearchText?.ToLower() ?? string.Empty; @@ -231,7 +231,7 @@ partial class LogHistoryViewModel : ViewModelBase,IDisposable CallerLineNumber = logDto.CallerLineNumber, CallerMember = logDto.CallerMember }; - return new NlogItemViewModel(nlog); + return new NlogItem(nlog); }).ToList(); _logItemList.Clear(); diff --git a/DMS.WPF/ViewModels/MainViewModel.cs b/DMS.WPF/ViewModels/MainViewModel.cs index 3ab6ac4..c2b37e5 100644 --- a/DMS.WPF/ViewModels/MainViewModel.cs +++ b/DMS.WPF/ViewModels/MainViewModel.cs @@ -6,7 +6,7 @@ using DMS.Core.Models; using DMS.WPF.Helper; using DMS.WPF.Interfaces; using DMS.WPF.Services; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using DMS.WPF.Views; using Microsoft.Extensions.Logging; @@ -36,7 +36,7 @@ public partial class MainViewModel : ViewModelBase /// 应用程序的菜单列表。 /// [ObservableProperty] - private ObservableCollection _menuTrees; + private ObservableCollection _menuTrees; /// /// 初始化 类的新实例。 diff --git a/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs b/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs index c7fde13..e0e5260 100644 --- a/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs +++ b/DMS.WPF/ViewModels/MqttServerDetailViewModel.cs @@ -6,7 +6,7 @@ using DMS.Application.Interfaces.Management; using DMS.Core.Models; using DMS.WPF.Interfaces; using DMS.WPF.ViewModels.Dialogs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using Microsoft.Extensions.Logging; using System.Collections.ObjectModel; @@ -31,7 +31,7 @@ namespace DMS.WPF.ViewModels /// 当前正在编辑的MQTT服务器对象。 /// [ObservableProperty] - private MqttServerItemViewModel _currentMqtt; + private MqttServerItem _currentMqtt; /// /// 与当前MQTT服务器关联的变量数据集合。 diff --git a/DMS.WPF/ViewModels/MqttsViewModel.cs b/DMS.WPF/ViewModels/MqttsViewModel.cs index b9a30ea..910d7dc 100644 --- a/DMS.WPF/ViewModels/MqttsViewModel.cs +++ b/DMS.WPF/ViewModels/MqttsViewModel.cs @@ -9,7 +9,7 @@ using DMS.Core.Models; using DMS.WPF.Interfaces; using DMS.WPF.Services; using DMS.WPF.ViewModels.Dialogs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using Microsoft.Extensions.Logging; using ObservableCollections; using System.Collections.ObjectModel; @@ -33,14 +33,14 @@ public partial class MqttsViewModel : ViewModelBase /// 设备列表。 /// [ObservableProperty] - private INotifyCollectionChangedSynchronizedViewList _mqttServeise; + private INotifyCollectionChangedSynchronizedViewList _mqttServeise; /// /// 当前选中的MQTT服务器。 /// [ObservableProperty] - private MqttServerItemViewModel _selectedMqtt; + private MqttServerItem _selectedMqtt; private readonly ILogger _logger; @@ -69,7 +69,7 @@ public partial class MqttsViewModel : ViewModelBase } [RelayCommand] - public async Task ToggleIsActive(MqttServerItemViewModel mqttServerItem) + public async Task ToggleIsActive(MqttServerItem mqttServerItem) { try { @@ -103,7 +103,7 @@ public partial class MqttsViewModel : ViewModelBase try { // 1. 显示添加MQTT服务器对话框 - MqttServerItemViewModel mqtt = await _dialogService.ShowDialogAsync(new MqttDialogViewModel() + MqttServerItem mqtt = await _dialogService.ShowDialogAsync(new MqttDialogViewModel() { Title = "添加MQTT服务器", PrimaryButText = "添加MQTT服务器" @@ -173,7 +173,7 @@ public partial class MqttsViewModel : ViewModelBase PrimaryButText = "保存修改" }; // 1. 显示MQTT服务器对话框 - MqttServerItemViewModel mqtt = await _dialogService.ShowDialogAsync(mqttDialogViewModel); + MqttServerItem mqtt = await _dialogService.ShowDialogAsync(mqttDialogViewModel); // 如果用户取消或对话框未返回MQTT服务器,则直接返回 if (mqtt == null) { diff --git a/DMS.WPF/ViewModels/TriggersViewModel.cs b/DMS.WPF/ViewModels/TriggersViewModel.cs index a6f0dc6..7a0d667 100644 --- a/DMS.WPF/ViewModels/TriggersViewModel.cs +++ b/DMS.WPF/ViewModels/TriggersViewModel.cs @@ -4,7 +4,7 @@ using CommunityToolkit.Mvvm.Input; using DMS.Application.DTOs; using DMS.WPF.Interfaces; using DMS.WPF.ViewModels.Dialogs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using Microsoft.Extensions.DependencyInjection; using ObservableCollections; @@ -21,10 +21,10 @@ namespace DMS.WPF.ViewModels private readonly INotificationService _notificationService; [ObservableProperty] - private ObservableDictionary _triggers ; + private ObservableDictionary _triggers ; [ObservableProperty] - private TriggerItemViewModel? _selectedTrigger; + private TriggerItem? _selectedTrigger; public TriggersViewModel( ITriggerDataService triggerDataService, @@ -49,7 +49,7 @@ namespace DMS.WPF.ViewModels [RelayCommand] private async Task AddTriggerAsync() { - var newTrigger = new TriggerItemViewModel() + var newTrigger = new TriggerItem() { IsActive = true, Condition = Core.Models.Triggers.ConditionType.GreaterThan, diff --git a/DMS.WPF/ViewModels/VariableHistoryViewModel.cs b/DMS.WPF/ViewModels/VariableHistoryViewModel.cs index 4af7bd6..82a71f8 100644 --- a/DMS.WPF/ViewModels/VariableHistoryViewModel.cs +++ b/DMS.WPF/ViewModels/VariableHistoryViewModel.cs @@ -10,7 +10,7 @@ using DMS.Core.Enums; using DMS.Core.Events; using DMS.Core.Models; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using LiveChartsCore; using LiveChartsCore.Defaults; using LiveChartsCore.SkiaSharpView; @@ -60,7 +60,7 @@ partial class VariableHistoryViewModel : ViewModelBase, INavigatable /// 选中的变量历史记录 /// [ObservableProperty] - private VariableItemViewModel _currentVariable; + private VariableItem _currentVariable; /// /// 变量历史记录列表 @@ -179,7 +179,7 @@ partial class VariableHistoryViewModel : ViewModelBase, INavigatable public override async Task OnNavigatedToAsync(NavigationParameter parameter) { - if (_dataStorageService.Variables.TryGetValue(parameter.TargetId, out VariableItemViewModel variableItem)) + if (_dataStorageService.Variables.TryGetValue(parameter.TargetId, out VariableItem variableItem)) { CurrentVariable = variableItem; // 加载所有变量的历史记录 diff --git a/DMS.WPF/ViewModels/VariableTableViewModel.cs b/DMS.WPF/ViewModels/VariableTableViewModel.cs index 80270b9..ae1cdb4 100644 --- a/DMS.WPF/ViewModels/VariableTableViewModel.cs +++ b/DMS.WPF/ViewModels/VariableTableViewModel.cs @@ -11,7 +11,7 @@ using DMS.Core.Events; using DMS.Core.Models; using DMS.WPF.Interfaces; using DMS.WPF.ViewModels.Dialogs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using Microsoft.Extensions.DependencyInjection; using ObservableCollections; @@ -36,14 +36,14 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable /// 通过 ObservableProperty 自动生成 VariableTable 属性和 OnVariableTableChanged 方法。 /// [ObservableProperty] - private VariableTableItemViewModel currentVariableTable; + private VariableTableItem currentVariableTable; /// /// 当前选中的变量数据。 /// 通过 ObservableProperty 自动生成 SelectedVariable 属性和 OnSelectedVariableDataChanged 方法。 /// [ObservableProperty] - private VariableItemViewModel _selectedVariable; + private VariableItem _selectedVariable; [ObservableProperty] @@ -87,9 +87,9 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable private readonly IDataStorageService _dataStorageService; - private readonly ObservableList _variableItemList; - private readonly ISynchronizedView _synchronizedView; - public NotifyCollectionChangedSynchronizedViewList VariableItemListView { get; } + private readonly ObservableList _variableItemList; + private readonly ISynchronizedView _synchronizedView; + public NotifyCollectionChangedSynchronizedViewList VariableItemListView { get; } private readonly INotificationService _notificationService; @@ -111,7 +111,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable IsLoadCompletion = false; // 初始设置为 false,表示未完成加载 - _variableItemList = new ObservableList(); + _variableItemList = new ObservableList(); _synchronizedView = _variableItemList.CreateView(v => v); VariableItemListView = _synchronizedView.ToNotifyCollectionChanged(); @@ -123,7 +123,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable /// /// 要过滤的集合中的单个项。 /// 如果项匹配搜索条件则为 true,否则为 false。 - private bool FilterVariables(VariableItemViewModel item) + private bool FilterVariables(VariableItem item) { // 尝试将项转换为 Variable 类型 var searchTextLower = SearchText.ToLower(); @@ -194,7 +194,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable variableDialogViewModel.PrimaryButText = "保存修改"; variableDialogViewModel.IsAddModel = false; // 创建一个副本用于编辑,避免直接修改原数据 - var variableToEdit = new VariableItemViewModel(); + var variableToEdit = new VariableItem(); _mapper.Map(SelectedVariable, variableToEdit); variableDialogViewModel.Variable = variableToEdit; @@ -272,7 +272,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable var addVariableDtos = await _variableManagementService.BatchImportVariablesAsync(improtVariableDtos); if (addVariableDtos is { Count: > 0 }) { - List variableItemViewModels = _mapper.Map>(addVariableDtos); + List variableItemViewModels = _mapper.Map>(addVariableDtos); _variableItemList.AddRange(variableItemViewModels); //更新数据中心 @@ -359,7 +359,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable var addVariableDtos = await _variableManagementService.BatchImportVariablesAsync(importedVariableDtos); if (addVariableDtos is { Count: > 0 }) { - List variableItemViewModels = _mapper.Map>(addVariableDtos); + List variableItemViewModels = _mapper.Map>(addVariableDtos); _variableItemList.AddRange(variableItemViewModels); foreach (var variableItemViewModel in variableItemViewModels) @@ -400,7 +400,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable // 显示添加变量数据的对话框 VariableDialogViewModel variableDialogViewModel = App.Current.Services.GetRequiredService(); - VariableItemViewModel variableItem = new VariableItemViewModel(); + VariableItem variableItem = new VariableItem(); variableItem.Protocol = CurrentVariableTable.Protocol; variableDialogViewModel.Title = "添加变量"; variableDialogViewModel.PrimaryButText = "添加变量"; @@ -446,7 +446,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable { try { - List variablesToDelete = SelectedVariables.Cast() + List variablesToDelete = SelectedVariables.Cast() .ToList(); // 检查是否有变量被选中 if (variablesToDelete == null || !variablesToDelete.Any()) @@ -509,7 +509,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable } // 获取选中的变量列表 - var validVariables = SelectedVariables.Cast() + var validVariables = SelectedVariables.Cast() .ToList(); // 显示轮询间隔选择对话框,并传入第一个变量的当前轮询间隔作为默认值 @@ -552,7 +552,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable } // 获取选中的变量列表 - var validVariables = SelectedVariables.Cast().ToList(); + var validVariables = SelectedVariables.Cast().ToList(); // --- 对话框调用 --- var viewModel = new InputDialogViewModel("修改数值转换公式", "请输入新的转换公式 (使用'x'代表变量值):", validVariables.First().ConversionFormula); @@ -592,7 +592,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable [RelayCommand] public async Task AddMqttServerToVariables(IList variablesToAddMqtt) { - var validVariables = variablesToAddMqtt?.OfType() + var validVariables = variablesToAddMqtt?.OfType() .ToList(); // 检查是否有变量被选中 @@ -703,7 +703,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable } // 获取选中的变量列表 - var validVariables = SelectedVariables.Cast() + var validVariables = SelectedVariables.Cast() .ToList(); // 显示启用状态选择对话框,并传入第一个变量的当前启用状态作为默认值 @@ -771,7 +771,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable public async Task ChangeHistorySettings(IList variablesToChange) { // 过滤出有效的VariableItemViewModel对象 - var validVariables = variablesToChange?.OfType() + var validVariables = variablesToChange?.OfType() .ToList(); // 检查是否有变量被选中 @@ -830,7 +830,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable } // 获取选中的变量列表 - var validVariables = SelectedVariables.Cast() + var validVariables = SelectedVariables.Cast() .ToList(); // 显示报警设置对话框,并传入第一个变量的当前报警设置作为默认值 diff --git a/DMS.WPF/ViewModels/ViewModelBase.cs b/DMS.WPF/ViewModels/ViewModelBase.cs index fa68805..1a375ae 100644 --- a/DMS.WPF/ViewModels/ViewModelBase.cs +++ b/DMS.WPF/ViewModels/ViewModelBase.cs @@ -1,7 +1,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using DMS.Core.Models; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.ViewModels; diff --git a/DMS.WPF/Views/Dialogs/ImportOpcUaDialog.xaml.cs b/DMS.WPF/Views/Dialogs/ImportOpcUaDialog.xaml.cs index 6c19c0c..993eed5 100644 --- a/DMS.WPF/Views/Dialogs/ImportOpcUaDialog.xaml.cs +++ b/DMS.WPF/Views/Dialogs/ImportOpcUaDialog.xaml.cs @@ -3,7 +3,7 @@ using DMS.WPF.Helper; using DMS.WPF.Interfaces; using DMS.WPF.Services; using DMS.WPF.ViewModels.Dialogs; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using iNKORE.UI.WPF.Modern.Controls; using System.Threading.Tasks; using System.Windows; @@ -63,7 +63,7 @@ public partial class ImportOpcUaDialog : ContentDialog //事件 public async void SelectedItemChanged(object selectedObj) { - if (selectedObj is OpcUaNodeItemViewModel selectedNode) + if (selectedObj is OpcUaNodeItem selectedNode) { if (this.DataContext is ImportOpcUaDialogViewModel viewModel) diff --git a/DMS.WPF/Views/Dialogs/TriggerDialog.xaml b/DMS.WPF/Views/Dialogs/TriggerDialog.xaml index 33e2326..5d9eac9 100644 --- a/DMS.WPF/Views/Dialogs/TriggerDialog.xaml +++ b/DMS.WPF/Views/Dialogs/TriggerDialog.xaml @@ -9,7 +9,7 @@ xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:ex="clr-namespace:DMS.Extensions" xmlns:converters="clr-namespace:DMS.WPF.Converters" - xmlns:items="clr-namespace:DMS.WPF.ViewModels.Items" + xmlns:items="clr-namespace:DMS.WPF.ItemViewModel" Title="{Binding Title}" mc:Ignorable="d" d:DesignHeight="700" @@ -68,7 +68,7 @@ - + - + diff --git a/DMS.WPF/Views/Dialogs/TriggerDialog.xaml.cs b/DMS.WPF/Views/Dialogs/TriggerDialog.xaml.cs index 099fe11..3968dda 100644 --- a/DMS.WPF/Views/Dialogs/TriggerDialog.xaml.cs +++ b/DMS.WPF/Views/Dialogs/TriggerDialog.xaml.cs @@ -1,7 +1,7 @@ using System.Windows.Controls; using System.Windows.Input; using DMS.WPF.Helper; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; using iNKORE.UI.WPF.Modern.Controls; namespace DMS.WPF.Views.Dialogs @@ -36,7 +36,7 @@ namespace DMS.WPF.Views.Dialogs /// private void VariableListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) { - if (VariableListBox.SelectedItem is VariableItemViewModel selectedVariable) + if (VariableListBox.SelectedItem is VariableItem selectedVariable) { var viewModel = DataContext as ViewModels.Dialogs.TriggerDialogViewModel; viewModel?.AddVariable(selectedVariable); @@ -48,7 +48,7 @@ namespace DMS.WPF.Views.Dialogs /// private void RemoveVariableButton_Click(object sender, System.Windows.RoutedEventArgs e) { - if (sender is System.Windows.Controls.Button button && button.Tag is VariableItemViewModel variable) + if (sender is System.Windows.Controls.Button button && button.Tag is VariableItem variable) { var viewModel = DataContext as ViewModels.Dialogs.TriggerDialogViewModel; viewModel?.RemoveVariable(variable); diff --git a/DMS.WPF/Views/MainView.xaml.cs b/DMS.WPF/Views/MainView.xaml.cs index 6a0d4fc..865b571 100644 --- a/DMS.WPF/Views/MainView.xaml.cs +++ b/DMS.WPF/Views/MainView.xaml.cs @@ -6,7 +6,7 @@ using Microsoft.Extensions.DependencyInjection; using DMS.Core.Enums; using DMS.Core.Models; using DMS.WPF.Interfaces; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Views; @@ -48,7 +48,7 @@ public partial class MainView : Window /// private async void NavigationView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args) { - var menu = args.SelectedItem as MenuItemViewModel; + var menu = args.SelectedItem as MenuItem; if (menu != null) { diff --git a/DMS.WPF/Views/VariableTableView.xaml.cs b/DMS.WPF/Views/VariableTableView.xaml.cs index 0b944dc..758a299 100644 --- a/DMS.WPF/Views/VariableTableView.xaml.cs +++ b/DMS.WPF/Views/VariableTableView.xaml.cs @@ -10,7 +10,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NLog; using DMS.Core.Enums; -using DMS.WPF.ViewModels.Items; +using DMS.WPF.ItemViewModel; namespace DMS.WPF.Views; diff --git a/DMS.sln b/DMS.sln index 0ac8efe..ae32d38 100644 --- a/DMS.sln +++ b/DMS.sln @@ -17,10 +17,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DMS.WPF", "DMS.WPF\DMS.WPF. {46E180A5-38CB-4229-915F-C9BC44534E77} = {46E180A5-38CB-4229-915F-C9BC44534E77} EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DMS.Infrastructure.UnitTests", "DMS.Infrastructure.UnitTests\DMS.Infrastructure.UnitTests.csproj", "{98D739FC-6184-4FC6-961F-F12ED57B0CC4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DMS.WPF.UnitTests", "DMS.WPF.UnitTests\DMS.WPF.UnitTests.csproj", "{C15E6B39-211C-417A-BC3F-551AD17C8905}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -43,14 +39,6 @@ Global {6059F299-9EE8-4A3F-8CD2-D00E2BDB5D5F}.Debug|Any CPU.Build.0 = Debug|Any CPU {6059F299-9EE8-4A3F-8CD2-D00E2BDB5D5F}.Release|Any CPU.ActiveCfg = Release|Any CPU {6059F299-9EE8-4A3F-8CD2-D00E2BDB5D5F}.Release|Any CPU.Build.0 = Release|Any CPU - {98D739FC-6184-4FC6-961F-F12ED57B0CC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {98D739FC-6184-4FC6-961F-F12ED57B0CC4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {98D739FC-6184-4FC6-961F-F12ED57B0CC4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {98D739FC-6184-4FC6-961F-F12ED57B0CC4}.Release|Any CPU.Build.0 = Release|Any CPU - {C15E6B39-211C-417A-BC3F-551AD17C8905}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C15E6B39-211C-417A-BC3F-551AD17C8905}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C15E6B39-211C-417A-BC3F-551AD17C8905}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C15E6B39-211C-417A-BC3F-551AD17C8905}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE