WPF MVVM应用:动态加载菜单项

<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);
                }
            }
        }
    }
}

 效果

猜你喜欢

转载自blog.csdn.net/cxb2011/article/details/89485349