diff --git a/DMS.WPF/Interfaces/IDataStorageService.cs b/DMS.WPF/Interfaces/IDataStorageService.cs index 20e6fc4..a709820 100644 --- a/DMS.WPF/Interfaces/IDataStorageService.cs +++ b/DMS.WPF/Interfaces/IDataStorageService.cs @@ -1,5 +1,7 @@ +using System.Collections.Concurrent; using System.Collections.ObjectModel; using DMS.WPF.ViewModels.Items; +using ObservableCollections; namespace DMS.WPF.Interfaces; @@ -8,17 +10,17 @@ public interface IDataStorageService /// /// 设备列表。 /// - ObservableCollection Devices { get; set; } + ObservableDictionary Devices { get; set; } /// /// 设备列表。 /// - ObservableCollection VariableTables { get; set; } + ObservableDictionary VariableTables { get; set; } /// /// 变量数据列表。 /// - ObservableCollection Variables { get; set; } + ObservableDictionary Variables { get; set; } /// /// MQTT服务器列表。 diff --git a/DMS.WPF/Services/DataEventService.cs b/DMS.WPF/Services/DataEventService.cs index b91a760..64f80f8 100644 --- a/DMS.WPF/Services/DataEventService.cs +++ b/DMS.WPF/Services/DataEventService.cs @@ -70,8 +70,8 @@ public class DataEventService : IDataEventService App.Current.Dispatcher.BeginInvoke(new Action(() => { // 查找并更新对应的变量 - var variableToUpdate = _dataStorageService.Variables.FirstOrDefault(v => v.Id == e.VariableId); - if (variableToUpdate != null) + + if (_dataStorageService.Variables.TryGetValue(e.VariableId,out var variableToUpdate)) { variableToUpdate.DataValue = e.NewValue; variableToUpdate.DisplayValue = e.NewValue; diff --git a/DMS.WPF/Services/DataStorageService.cs b/DMS.WPF/Services/DataStorageService.cs index 5112664..a31315b 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 ObservableCollections; namespace DMS.WPF.Services; @@ -11,17 +12,17 @@ public class DataStorageService : IDataStorageService /// /// 设备列表。 /// - public ObservableCollection Devices { get; set; } + public ObservableDictionary Devices { get; set; } /// /// 设备列表。 /// - public ObservableCollection VariableTables { get; set; } + public new ObservableDictionary VariableTables { get; set; } /// /// 变量数据列表。 /// - public ObservableCollection Variables { get; set; } + public ObservableDictionary Variables { get; set; } /// @@ -46,9 +47,9 @@ public class DataStorageService : IDataStorageService public DataStorageService() { - Devices=new ObservableCollection(); - VariableTables = new ObservableCollection(); - Variables=new ObservableCollection(); + Devices=new ObservableDictionary(); + VariableTables = new ObservableDictionary(); + Variables=new ObservableDictionary(); MqttServers=new ObservableCollection(); Menus=new ObservableCollection(); MenuTrees=new ObservableCollection(); diff --git a/DMS.WPF/Services/DeviceDataService.cs b/DMS.WPF/Services/DeviceDataService.cs index db89507..6d758b8 100644 --- a/DMS.WPF/Services/DeviceDataService.cs +++ b/DMS.WPF/Services/DeviceDataService.cs @@ -52,8 +52,8 @@ public class DeviceDataService : IDeviceDataService { _uiDispatcher.Invoke(() => { - var device = _dataStorageService.Devices.FirstOrDefault(d => d.Id == e.DeviceId); - if (device != null) + + if (_dataStorageService.Devices.TryGetValue(e.DeviceId,out DeviceItemViewModel device)) { device.IsRunning = e.NewStatus; @@ -76,7 +76,7 @@ public class DeviceDataService : IDeviceDataService { foreach (var deviceDto in _appDataStorageService.Devices.Values) { - _dataStorageService.Devices.Add(_mapper.Map(deviceDto)); + _dataStorageService.Devices.Add(deviceDto.Id,_mapper.Map(deviceDto)); } } @@ -95,7 +95,7 @@ public class DeviceDataService : IDeviceDataService if (_dataStorageService != null && addDto != null && addDto.Device != null) { //更新当前界面 - _dataStorageService.Devices.Add(_mapper.Map(addDto.Device)); + _dataStorageService.Devices.Add(addDto.Device.Id,_mapper.Map(addDto.Device)); } // 添加null检查 @@ -163,9 +163,8 @@ public class DeviceDataService : IDeviceDataService _appDataCenterService.DeviceManagementService.RemoveDeviceFromMemory(device.Id); // 删除设备 - _dataStorageService.Devices.Remove(device); - - return true; + + return _dataStorageService.Devices.Remove(device.Id); } /// diff --git a/DMS.WPF/Services/VariableDataService.cs b/DMS.WPF/Services/VariableDataService.cs index a9edf8a..f50ed51 100644 --- a/DMS.WPF/Services/VariableDataService.cs +++ b/DMS.WPF/Services/VariableDataService.cs @@ -38,9 +38,9 @@ public class VariableDataService : IVariableDataService { foreach (var variableTable in _dataStorageService.VariableTables) { - foreach (var variable in variableTable.Variables) + foreach (var variable in variableTable.Value.Variables) { - _dataStorageService.Variables.Add(variable); + _dataStorageService.Variables.Add(variable.Id,variable); } } } @@ -130,13 +130,13 @@ public class VariableDataService : IVariableDataService // 删除与当前变量表关联的所有变量 foreach (var variable in variableTable.Variables) { - _dataStorageService.Variables.Remove(variable); + _dataStorageService.Variables.Remove(variable.Id); } _appDataCenterService.VariableTableManagementService.RemoveVariableTableFromMemory(variableTable.Id); // 删除变量表 - _dataStorageService.VariableTables.Remove(variableTable); + _dataStorageService.VariableTables.Remove(variableTable.Id); variableTable.Device.VariableTables.Remove(variableTable); return true; } @@ -151,7 +151,7 @@ public class VariableDataService : IVariableDataService return; } - _dataStorageService.Variables.Add(variableItem); + _dataStorageService.Variables.Add(variableItem.Id,variableItem); } /// @@ -159,16 +159,16 @@ public class VariableDataService : IVariableDataService /// public void DeleteVariable(int id) { - var variableItem = _dataStorageService.Variables.FirstOrDefault(v => v.Id == id); - if (variableItem == null) + if (!_dataStorageService.Variables.TryGetValue(id,out var variableItem)) { return; } - var variableTable = _dataStorageService.VariableTables.FirstOrDefault(vt => vt.Id == variableItem.VariableTableId); + if (_dataStorageService.VariableTables.TryGetValue(variableItem.VariableTableId, out var variableTable)) + { + variableTable.Variables.Remove(variableItem); + } - variableTable.Variables.Remove(variableItem); - - _dataStorageService.Variables.Remove(variableItem); + _dataStorageService.Variables.Remove(variableItem.Id); } } \ No newline at end of file diff --git a/DMS.WPF/Services/VariableTableDataService.cs b/DMS.WPF/Services/VariableTableDataService.cs index b00502d..d6837f0 100644 --- a/DMS.WPF/Services/VariableTableDataService.cs +++ b/DMS.WPF/Services/VariableTableDataService.cs @@ -34,9 +34,9 @@ public class VariableTableDataService : IVariableTableDataService { foreach (var device in _dataStorageService.Devices) { - foreach (var variableTable in device.VariableTables) + foreach (var variableTable in device.Value.VariableTables) { - _dataStorageService.VariableTables.Add(variableTable); + _dataStorageService.VariableTables.Add(variableTable.Id,variableTable); } } } @@ -117,7 +117,7 @@ public class VariableTableDataService : IVariableTableDataService // 删除与当前变量表关联的所有变量 foreach (var variable in variableTable.Variables) { - _dataStorageService.Variables.Remove(variable); + _dataStorageService.Variables.Remove(variable.Id); } _appDataCenterService.VariableTableManagementService.RemoveVariableTableFromMemory(variableTable.Id); @@ -126,7 +126,7 @@ public class VariableTableDataService : IVariableTableDataService =_dataStorageService.Menus.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && m.TargetId == variableTable.Id); _menuDataService.DeleteMenuItem(variableTableMenu); // 删除变量表 - _dataStorageService.VariableTables.Remove(variableTable); + _dataStorageService.VariableTables.Remove(variableTable.Id); variableTable.Device.VariableTables.Remove(variableTable); return true; } diff --git a/DMS.WPF/ViewModels/DeviceDetailViewModel.cs b/DMS.WPF/ViewModels/DeviceDetailViewModel.cs index f8c9f8e..7b9e21a 100644 --- a/DMS.WPF/ViewModels/DeviceDetailViewModel.cs +++ b/DMS.WPF/ViewModels/DeviceDetailViewModel.cs @@ -159,8 +159,7 @@ public partial class DeviceDetailViewModel : ViewModelBase, INavigatable public async Task OnNavigatedToAsync(MenuItemViewModel menu) { - var device = _dataStorageService.Devices.FirstOrDefault(d => d.Id == menu.TargetId); - if (device != null) + if (_dataStorageService.Devices.TryGetValue(menu.TargetId,out var device)) { CurrentDevice = device; } diff --git a/DMS.WPF/ViewModels/DevicesViewModel.cs b/DMS.WPF/ViewModels/DevicesViewModel.cs index 66374a7..a308413 100644 --- a/DMS.WPF/ViewModels/DevicesViewModel.cs +++ b/DMS.WPF/ViewModels/DevicesViewModel.cs @@ -11,6 +11,7 @@ using DMS.WPF.Services; using DMS.WPF.ViewModels.Dialogs; using DMS.WPF.ViewModels.Items; using iNKORE.UI.WPF.Modern.Common.IconKeys; +using ObservableCollections; namespace DMS.WPF.ViewModels; @@ -31,7 +32,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable /// 设备列表。 /// [ObservableProperty] - private ObservableCollection _devices; + private INotifyCollectionChangedSynchronizedViewList _devices; /// @@ -52,7 +53,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable /// 主数据服务。 /// 设备应用服务。 /// 通知服务。 - public DevicesViewModel(IMapper mapper,IDataStorageService dataStorageService, + public DevicesViewModel(IMapper mapper, IDataStorageService dataStorageService, IDialogService dialogService, INavigationService navigationService, IWPFDataService wpfDataService, IDeviceAppService deviceAppService, INotificationService notificationService) @@ -64,7 +65,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable _wpfDataService = wpfDataService; _deviceAppService = deviceAppService; _notificationService = notificationService; - Devices = _dataStorageService.Devices; + Devices = _dataStorageService.Devices.ToNotifyCollectionChanged(x => x.Value); } @@ -131,7 +132,7 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable if (_wpfDataService != null && _wpfDataService.DeviceDataService != null) { var addDto = await _wpfDataService.DeviceDataService.AddDevice(dto); - + // 添加null检查 if (addDto != null && addDto.Device != null && _notificationService != null) { @@ -239,15 +240,12 @@ public partial class DevicesViewModel : ViewModelBase, INavigatable public async Task OnNavigatedToAsync(MenuItemViewModel menu) { - - } private void OnDeviceIsActiveChanged(object? sender, bool isActive) { if (sender is DeviceItemViewModel deviceItemViewModel) { - } } } \ No newline at end of file diff --git a/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs b/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs index b4655c6..45c2818 100644 --- a/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs +++ b/DMS.WPF/ViewModels/Dialogs/VariableDialogViewModel.cs @@ -83,7 +83,7 @@ public partial class VariableDialogViewModel : DialogViewModelBase v.Name == Variable.Name || (v.Protocol == ProtocolType.S7 && v.S7Address == Variable.S7Address) || (v.Protocol == ProtocolType.OpcUa && v.OpcUaNodeId == Variable.OpcUaNodeId)).ToList(); + var existVariables = _dataStorageService.Variables.Where(v => 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; if (IsAddModel) { @@ -92,6 +92,7 @@ public partial class VariableDialogViewModel : DialogViewModelBase v.Id != Variable.Id); + } if (existVariable != null) diff --git a/DMS.WPF/ViewModels/VariableHistoryViewModel.cs b/DMS.WPF/ViewModels/VariableHistoryViewModel.cs index 3ed88d3..a10c775 100644 --- a/DMS.WPF/ViewModels/VariableHistoryViewModel.cs +++ b/DMS.WPF/ViewModels/VariableHistoryViewModel.cs @@ -138,20 +138,20 @@ partial class VariableHistoryViewModel : ViewModelBase, INavigatable if (!string.IsNullOrWhiteSpace(SearchText)) { - // 根据搜索文本过滤建议列表 - var filteredVariables = _dataStorageService.Variables - .Where(v => - v.Name?.Contains( - SearchText, StringComparison.OrdinalIgnoreCase) == - true) - .Select(v => v.Name) - .Take(10) - .ToList(); - - foreach (var variable in filteredVariables) - { - _suggestedVariables.Add(variable); - } + // // 根据搜索文本过滤建议列表 + // var filteredVariables = _dataStorageService.Variables + // .Where(v => + // v.Name?.Contains( + // SearchText, StringComparison.OrdinalIgnoreCase) == + // true) + // .Select(v => v.Name) + // .Take(10) + // .ToList(); + // + // foreach (var variable in filteredVariables) + // { + // _suggestedVariables.Add(variable); + // } } } diff --git a/DMS.WPF/ViewModels/VariableTableViewModel.cs b/DMS.WPF/ViewModels/VariableTableViewModel.cs index 58cc923..9bf03b4 100644 --- a/DMS.WPF/ViewModels/VariableTableViewModel.cs +++ b/DMS.WPF/ViewModels/VariableTableViewModel.cs @@ -806,9 +806,7 @@ partial class VariableTableViewModel : ViewModelBase, INavigatable public async Task OnNavigatedToAsync(MenuItemViewModel menu) { - var varTable =_dataStorageService.VariableTables.FirstOrDefault(v => v.Id == menu.TargetId); - - if (varTable != null) + if (_dataStorageService.VariableTables.TryGetValue(menu.TargetId,out var varTable)) { CurrentVariableTable = varTable; // 根据变量表的协议类型设置对应的布尔属性