【WPF】Menu使用汇总

 


一、动态绑定ItemSource的MenuItem如何绑定事件并传入参数

复制代码
        <Menu DockPanel.Dock="Top">
            <MenuItem Header="A">
                <MenuItem Header="B1"/>
                <MenuItem Header="B2"/>
                <MenuItem Header="B3"/>
                <MenuItem ItemsSource="{Binding Commands}" Header="B4">
                    <MenuItem.ItemContainerStyle>
                        <Style TargetType="{x:Type MenuItem}">
                            <Setter Property="Header" Value="{Binding Path=Text}" />
                            <Setter Property="Command" Value="{Binding Path=Command}" />
                            <Setter Property="CommandParameter" Value="{Binding Path=Parameter}" />
                        </Style>
                    </MenuItem.ItemContainerStyle>
                </MenuItem>
            </MenuItem>
        </Menu>
复制代码

ViewModel:

添加引用:Microsoft.Practices.Prism

 

 

复制代码
    public class NotifyPropertyBase : INotifyPropertyChanged
    {
        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        [field: NonSerialized]
        public event PropertyChangedEventHandler PropertyChanged;
    }

    public class MenuViewModel : NotifyPropertyBase
    {
        public ICommand GoCommand { get; private set; }

        private List<MyCommand> _commands = new List<MyCommand>();
        public List<MyCommand> Commands
        {
            get { return _commands; }
        }

        public MenuViewModel()
        {
            GoCommand = new DelegateCommand<object>(OnGoCommand);
            LoadCommands();
        }

        private void LoadCommands()
        {
           //数据绑定
           for (int i = 0; i < 5; i++)
           {
               //Parameter就是子菜单的文本名称,点击时触发
               MyCommand c1 = new MyCommand { Command = GoCommand, Parameter = string.Format("MenuName{0}", i), Text = string.Format("MenuName{0}", i) };
               _commands.Add(c1);
           }
        }

        /// <summary>
        /// 功能函数
        /// </summary>
        /// <param name="obj">传入子菜单项的Parameter值</param>
        private void OnGoCommand(object obj)
        {
            string GetName = (string)obj;
            MessageBox.Show(GetName);
        }
    }

    public class MyCommand
    {
        //名称可以改但要与界面绑定一致
        public ICommand Command { get; set; }
        public string Text { get; set; }
        public string Parameter { get; set; }
    } 
复制代码

 

如果动态绑定的MenuItem的内容后面需要更新,数据源Commands的定义需要改成以下方式才能刷新UI:

复制代码
        //private List<MyCommand> _commands = new List<MyCommand>();
        //public List<MyCommand> Commands
        //{
        //    //方式1:无法刷新
        //    //get { return _commands; } 

        //    //方式2:无法刷新
        //     get
        //    {
        //        if (_commands == null)
        //        {
        //            _commands = new List<MyCommand>();
        //        }
        //        return _commands;
        //    }
        //    set
        //    {
        //        _commands = value;
        //        OnPropertyChanged("Commands");
        //    }
        //}

        private ObservableCollection<MyCommand> _commands = new ObservableCollection<MyCommand>();
        public ObservableCollection<MyCommand> Commands
        {
            get { return _commands; }
            set
            {
                _commands = value;
                OnPropertyChanged("Commands");
            }
        }
复制代码

 

参考链接:http://cn.voidcc.com/question/p-ufqvonpj-gs.html

https://blog.csdn.net/weixin_30322405/article/details/99837992/

posted @   不溯流光  阅读(1564)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示