【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 @ 2023-01-30 17:48  不溯流光  阅读(1164)  评论(0编辑  收藏  举报