完成菜单树的转换

This commit is contained in:
2025-07-26 14:12:14 +08:00
parent 527fb88cdf
commit 825f51d1ce
5 changed files with 49 additions and 16 deletions

View File

@@ -45,6 +45,9 @@ public partial class DataServices : ObservableRecipient, IRecipient<LoadMessage>
// 菜单树列表。
[ObservableProperty]
private ObservableCollection<MenuBeanItemViewModel> _menus;
// 菜单树列表。
[ObservableProperty]
private ObservableCollection<MenuBeanItemViewModel> _menuTrees;
// MQTT配置列表。
// [ObservableProperty]
@@ -68,19 +71,6 @@ public partial class DataServices : ObservableRecipient, IRecipient<LoadMessage>
public event Action<Device, bool> OnDeviceIsActiveChanged;
// /// <summary>
// /// 当_mqtts属性值改变时触发的局部方法用于调用OnMqttListChanged事件。
// /// </summary>
// /// <param name="mqtts">新的MQTT配置列表。</param>
// partial void OnMqttsChanged(List<Mqtt> mqtts)
// {
// OnMqttListChanged?.Invoke(mqtts);
// }
// 注释掉的代码块,可能用于变量数据变更事件的触发,但目前未启用。
// {
// OnVariableDataChanged?.Invoke(this, value);
// }
/// <summary>
/// DataServices类的构造函数。
@@ -101,6 +91,7 @@ public partial class DataServices : ObservableRecipient, IRecipient<LoadMessage>
VariableTables = new ObservableCollection<VariableTableItemViewModel>();
Variables = new ObservableCollection<VariableItemViewModel>();
Menus = new ObservableCollection<MenuBeanItemViewModel>();
MenuTrees = new ObservableCollection<MenuBeanItemViewModel>();
// AllVariables = new ConcurrentDictionary<int, Variable>();
}
@@ -258,6 +249,44 @@ public partial class DataServices : ObservableRecipient, IRecipient<LoadMessage>
Menus.Add(_mapper.Map<MenuBeanItemViewModel>(newDto));
}
}
BuildMenuTree();
}
/// <summary>
/// 根据扁平菜单列表构建树形结构。
/// </summary>
/// <param name="flatMenus">扁平菜单列表。</param>
/// <returns>树形结构的根菜单列表。</returns>
private void BuildMenuTree()
{
// 1. 创建一个查找表以便通过ID快速访问菜单项
var menuLookup = Menus.ToDictionary(m => m.Id);
// 存储根菜单项的列表
// var rootMenus = new List<MenuBeanDto>();
// 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);
}
}
}

View File

@@ -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<MenuBeanItemViewModel> _children=new ();
public MenuBeanItemViewModel(MenuBeanDto dto)
{

View File

@@ -67,7 +67,7 @@ public partial class SplashViewModel : ObservableObject
{
// 处理初始化过程中的异常
LoadingMessage = $"初始化失败: {ex.Message}";
Console.WriteLine($"初始化失败: {ex.Message}");
Console.WriteLine($"初始化失败: {ex}");
// 在此可以记录日志或显示错误对话框
return false;
}

View File

@@ -32,7 +32,7 @@
<DataTemplate x:Key="NavigationViewMenuItem"
DataType="{x:Type mo:MenuBean}">
<ui:NavigationViewItem Content="{Binding Header}"
MenuItemsSource="{Binding Items }">
MenuItemsSource="{Binding Children }">
<ui:NavigationViewItem.Icon>
<ui:FontIcon Glyph="{Binding Icon}" />
</ui:NavigationViewItem.Icon>
@@ -60,7 +60,7 @@
IsBackButtonVisible="Collapsed"
IsBackEnabled="False"
SelectionFollowsFocus="Disabled"
MenuItemsSource="{Binding DataServices.Menus}"
MenuItemsSource="{Binding DataServices.MenuTrees}"
MenuItemTemplate="{StaticResource NavigationViewMenuItem}"
SelectionChanged="NavigationView_SelectionChanged">