【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/
/*******相与枕藉乎舟中,不知东方之既白*******/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!