WPF MVVM应用:动态加载菜单项_wpf 如何加载菜单-程序员宅基地

技术标签: .Net应用技术  

<Menu x:Name="MainMenu" ItemsSource="{Binding MenuItems}" ></Menu>
  • ViewModel

using Prism.Mvvm;
using SqlHelp;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using System.Windows.Controls;

namespace WPFSale.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {

        private ObservableCollection<MenuItem> menus;

        public ObservableCollection<MenuItem> MenuItems
        {
            get { return menus; }
            set { SetProperty(ref menus, value); }
        }


        public MainWindowViewModel()
        {
          LoadMenus();
        }

        private void LoadMenus()
        {
           
            //读取菜单数据库数据
            DataTable dataTable = Database.ExecSqlReturnDataTable("select * from Fun  order by OrderID asc");

            //加载1级菜单  FunID/   ClassName窗口名称
            var FirstRows = from p in dataTable.AsEnumerable() where p.Field<string>("PFunID") == "0" select p;
            List<MenuItem> Menu1Items = new List<MenuItem>();

            foreach (var r in FirstRows)
            {
                MenuItem menuItem = new MenuItem();
                menuItem.Name = "M" + r["FunID"].ToString() + "_" + r["ClassName"].ToString();
                menuItem.RenderSize = new System.Windows.Size(130, 0x16);
                menuItem.Header = r["FunName"].ToString();

                AddChildMenu(menuItem, r["FunID"].ToString(), dataTable);//增加子菜单项
                Menu1Items.Add(menuItem);
            }

            MenuItems=new ObservableCollection<MenuItem>( Menu1Items);

        }

        private  void AddChildMenu(MenuItem item,string sfunID,DataTable dataTable)
        {
            var rs = from p in dataTable.AsEnumerable()
                     where p.Field<string>("PFunID") == sfunID     select p;
            foreach (var r in rs)
            {
                if (r.Field<string>("FunName") != "-")
                {
                    MenuItem subItem = new MenuItem
                    {
                        Name = "M_" + r["FunID"].ToString() + "_" + r["ClassName"].ToString(),
                        RenderSize = new System.Windows.Size(130, 0x16),
                        Header = r["FunName"].ToString()
                    };
                    item.Items.Add(subItem);
                        AddChildMenu(subItem, r["FunID"].ToString(), dataTable);

                }
                else
                {
                    Separator separator = new Separator { Name = "M_" + r.Field<int>("FunID").ToString() };
                    item.Items.Add(separator);
                }
            }
        }
    }
}

 效果

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cxb2011/article/details/89485349

智能推荐

混合开发 Hybird Ionic Angular Cordova web 跨平台 MD-程序员宅基地

文章浏览阅读201次。Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 [email protected]混合开发 Hybird Ionic Angular Cordova web 跨平台 MD..._> ionic integrations enable cordova [info] downloading integration cordova [

javaWeb基础之Servlet的三种实现方式以及两种配置方式_servlet需要重写什么方法-程序员宅基地

文章浏览阅读4.5k次。一、Servlet的三种实现方式Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。1、Servlet的第一种创建方式:继承HttpServlet(最优) 重写doGet(HttpServletRequest request, HttpS..._servlet需要重写什么方法

strlen函数以及string类使用心得_string strlen-程序员宅基地

文章浏览阅读3.1k次。复习一下strlen函数其实,给strlen函数之后它就会向下偏移统计个数,遇到当前位置字符为'\0'才会停下来。如果没有的话就有可能接着往下走下去,甚至会超过开辟空间的区域指向一片未开辟空间赋值的空间。所以服务端这边接收的buffer要比需要接收的数据大小大一点才不会在strlen的时候出现问题,因为数组里面的数据都占满了,最后一个'\0'的位置没留下来,粗心大意。函数原型..._string strlen

面试官:小伙子你来介绍一下MyBatis_spring cloud mybatis 面试项目介绍怎么说-程序员宅基地

文章浏览阅读598次。虽然目前 Spring Security 一片火热,但是 Shiro 的市场依然存在,今天我就来稍微的说一说这两个框架的,方便大家在实际项目中选择适合自己的安全管理框架。首先我要声明一点,框架无所谓好坏,关键是适合当前项目场景,作为一个年轻的程序员更不应该厚此薄彼,或者拒绝学习某一个框架。小孩子才做选择题,成年人两个都要学!所以接下来主要结合我自己的经验来说一说这两个框架的优缺点,没有提到的地方也欢迎大家留言补充。Spring Security 并非一个新生的事物,它最早不叫 Spring Security_spring cloud mybatis 面试项目介绍怎么说

springboot水果商城开发设计与实现.rar(项目源码)兼容小程序端+pc端-程序员宅基地

文章浏览阅读493次。微信小程序前端+springboot后端+jsp+mysql数据库前端pc端,项目源码:实现水果商城的分类、商品详细页、收藏商品、订单管理、购物车、用户管理、公告管理、评论管理等功能,项目采用微信小程序端,hbuilder开发,idea工具项目截图项目源码下载地址:请点击!》》》...

记一个拯救者工具箱Lenovo Legion Toolkit-程序员宅基地

文章浏览阅读536次。Lenovo Legion Toolkit_lenovo legion toolkit

随便推点

数据库谓词-程序员宅基地

文章浏览阅读2.1k次,点赞3次,收藏5次。谓词:属于函数的一种,但其返回值是真值(true/false/unknown)判断是否存在满足某种条件的记录,存在返回TRUE、不存在返回FALSE。比较多用到的几种谓词:LIKEBETWEENIS NULL/IS NOT NULLINEXISTSLIKE谓词——字符串的部分一直查询(模糊查询)--MySQL--DDL:创建表CREATE TABLE SampleLike..._数据库 连接谓词是什么

论文学习笔记-MobileNet v3_mobilenetv3扩张尺寸-程序员宅基地

文章浏览阅读9.3k次,点赞5次,收藏36次。『写在前面』新一代MobileNet,性能全面提升。作者机构:Andrew Howard等,Google。文章标题:《Searching for MobileNetV3》原文链接:https://arxiv.org/abs/1905.02244v2相关repo:摘要结合网络设计和NAS技术提出新一代MobileNets; 发布了两种网络结构:MobileNetV3..._mobilenetv3扩张尺寸

2022(软考高级)信息系统项目管理师认证招生简章_山东省信息系统项目管理专业院校-程序员宅基地

文章浏览阅读331次。信息系统项目管理师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。信息系统项目管理师,属于软考三个级别中的“高级”。从1999年开始实施系统集成项目管理工程师/信息系统项目管理师,到目前为止,累计报名人数超过了300万人次,累计合格人数接近50万人。【报考要求】不设学历与资历条件、年龄以及专业等限制,考生可根据自己的技术水平选择合适的级别合适的资格进行报考。凡遵守中华人_山东省信息系统项目管理专业院校

python2.7实战教程_实战 - 廖雪峰 Python 2.7 中文教程-程序员宅基地

文章浏览阅读82次。看完了教程,是不是有这么一种感觉:看的时候觉得很简单,照着教程敲代码也没啥大问题。于是准备开始独立写代码,就发现不知道从哪开始下手了。这种情况是完全正常的。好比学写作文,学的时候觉得简单,写的时候就无从下笔了。虽然这个教程是面向小白的零基础Python教程,但是我们的目标不是学到60分,而是学到90分。所以,用Python写一个真正的Web App吧!目标我们设定的实战目标是一个Blog网站,包含..._python快速编程入门第二版2.7.1实训案例

神经网络是线性还是非线性,神经网络的非线性_非线性神经网络-程序员宅基地

文章浏览阅读4.5k次。BP算法的基本思想是:学习过程由信号正向传播与误差的反向回传两个部分组成;正向传播时,输入样本从输入层传入,经各隐层依次逐层处理,传向输出层,若输出层输出与期望不符,则将误差作为调整信号逐层反向回传,对神经元之间的连接权矩阵做出处理,使误差减小。经反复学习,最终使误差减小到可接受的范围。具体步骤如下:1、从训练集中取出某一样本,把信息输入网络中。2、通过各节点间的连接情况正向逐层处理后,得到神经网络的实际输出。3、计算网络实际输出与期望输出的误差。..._非线性神经网络

简单数独的DFS求解_数独dfs算法 go-程序员宅基地

文章浏览阅读536次。@TOP简单数独的DFS求解1. 问题给出9×9的标准数独,使用C语言编程完成这个数独的求解。数独数独(shù dú)是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复 [1] 。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每_数独dfs算法 go

推荐文章

热门文章

相关标签