From 825f51d1cea4e30612e5fe745afa2bf6fd61be05 Mon Sep 17 00:00:00 2001 From: "David P.G" Date: Sat, 26 Jul 2025 14:12:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=8F=9C=E5=8D=95=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DMS.Application/Interfaces/IMenuService.cs | 1 + DMS.WPF/Services/DataServices.cs | 55 ++++++++++++++----- .../ViewModels/Items/MenuBeanItemViewModel.cs | 3 + DMS.WPF/ViewModels/SplashViewModel.cs | 2 +- DMS.WPF/Views/MainView.xaml | 4 +- 5 files changed, 49 insertions(+), 16 deletions(-) diff --git a/DMS.Application/Interfaces/IMenuService.cs b/DMS.Application/Interfaces/IMenuService.cs index f6d3e41..01d1889 100644 --- a/DMS.Application/Interfaces/IMenuService.cs +++ b/DMS.Application/Interfaces/IMenuService.cs @@ -31,4 +31,5 @@ public interface IMenuService /// 异步删除一个菜单。 /// Task DeleteMenuAsync(int id); + } \ No newline at end of file diff --git a/DMS.WPF/Services/DataServices.cs b/DMS.WPF/Services/DataServices.cs index bf78c59..9c43736 100644 --- a/DMS.WPF/Services/DataServices.cs +++ b/DMS.WPF/Services/DataServices.cs @@ -45,6 +45,9 @@ public partial class DataServices : ObservableRecipient, IRecipient // 菜单树列表。 [ObservableProperty] private ObservableCollection _menus; + // 菜单树列表。 + [ObservableProperty] + private ObservableCollection _menuTrees; // MQTT配置列表。 // [ObservableProperty] @@ -68,19 +71,6 @@ public partial class DataServices : ObservableRecipient, IRecipient public event Action OnDeviceIsActiveChanged; - // /// - // /// 当_mqtts属性值改变时触发的局部方法,用于调用OnMqttListChanged事件。 - // /// - // /// 新的MQTT配置列表。 - // partial void OnMqttsChanged(List mqtts) - // { - // OnMqttListChanged?.Invoke(mqtts); - // } - - // 注释掉的代码块,可能用于变量数据变更事件的触发,但目前未启用。 - // { - // OnVariableDataChanged?.Invoke(this, value); - // } /// /// DataServices类的构造函数。 @@ -101,6 +91,7 @@ public partial class DataServices : ObservableRecipient, IRecipient VariableTables = new ObservableCollection(); Variables = new ObservableCollection(); Menus = new ObservableCollection(); + MenuTrees = new ObservableCollection(); // AllVariables = new ConcurrentDictionary(); } @@ -258,6 +249,44 @@ public partial class DataServices : ObservableRecipient, IRecipient Menus.Add(_mapper.Map(newDto)); } } + + BuildMenuTree(); + } + + /// + /// 根据扁平菜单列表构建树形结构。 + /// + /// 扁平菜单列表。 + /// 树形结构的根菜单列表。 + private void BuildMenuTree() + { + // 1. 创建一个查找表,以便通过ID快速访问菜单项 + var menuLookup = Menus.ToDictionary(m => m.Id); + + // 存储根菜单项的列表 + // var rootMenus = new List(); + + // 2. 遍历所有菜单项,构建树形结构 + foreach (var menu in Menus) + { + // 检查是否有父ID,并且父ID不为0(通常0或null表示根节点) + if (menu.ParentId.HasValue && menu.ParentId.Value != 0) + { + // 尝试从查找表中找到父菜单 + if (menuLookup.TryGetValue(menu.ParentId.Value, out var parentMenu)) + { + // 将当前菜单添加到父菜单的Children列表中 + parentMenu.Children.Add(menu); + } + // else: 如果找不到父菜单,这可能是一个数据完整性问题,可以根据需要处理 + } + else + { + // 如果没有父ID,则这是一个根菜单 + MenuTrees.Add(menu); + } + } + } diff --git a/DMS.WPF/ViewModels/Items/MenuBeanItemViewModel.cs b/DMS.WPF/ViewModels/Items/MenuBeanItemViewModel.cs index 97122cb..e041291 100644 --- a/DMS.WPF/ViewModels/Items/MenuBeanItemViewModel.cs +++ b/DMS.WPF/ViewModels/Items/MenuBeanItemViewModel.cs @@ -1,3 +1,4 @@ +using System.Collections.ObjectModel; using CommunityToolkit.Mvvm.ComponentModel; using DMS.Application.DTOs; using DMS.Core.Enums; @@ -28,6 +29,8 @@ public partial class MenuBeanItemViewModel : ObservableObject [ObservableProperty] private int _displayOrder; + [ObservableProperty] + private ObservableCollection _children=new (); public MenuBeanItemViewModel(MenuBeanDto dto) { diff --git a/DMS.WPF/ViewModels/SplashViewModel.cs b/DMS.WPF/ViewModels/SplashViewModel.cs index 99d2c6a..b9a2a9e 100644 --- a/DMS.WPF/ViewModels/SplashViewModel.cs +++ b/DMS.WPF/ViewModels/SplashViewModel.cs @@ -67,7 +67,7 @@ public partial class SplashViewModel : ObservableObject { // 处理初始化过程中的异常 LoadingMessage = $"初始化失败: {ex.Message}"; - Console.WriteLine($"初始化失败: {ex.Message}"); + Console.WriteLine($"初始化失败: {ex}"); // 在此可以记录日志或显示错误对话框 return false; } diff --git a/DMS.WPF/Views/MainView.xaml b/DMS.WPF/Views/MainView.xaml index f076c54..59e8ba2 100644 --- a/DMS.WPF/Views/MainView.xaml +++ b/DMS.WPF/Views/MainView.xaml @@ -32,7 +32,7 @@ + MenuItemsSource="{Binding Children }"> @@ -60,7 +60,7 @@ IsBackButtonVisible="Collapsed" IsBackEnabled="False" SelectionFollowsFocus="Disabled" - MenuItemsSource="{Binding DataServices.Menus}" + MenuItemsSource="{Binding DataServices.MenuTrees}" MenuItemTemplate="{StaticResource NavigationViewMenuItem}" SelectionChanged="NavigationView_SelectionChanged">