这是一个事件的辅助类,可以通过它实现MenuItem的Command事件

public class MyCommands : Freezable, ICommand, ICommandSource{public MyCommands() {}public static readonly DependencyProperty CommandParameterProperty =DependencyProperty.Register("CommandParameter",typeof(object),typeof(MyCommands),new PropertyMetadata((object)null));public object CommandParameter{get{return (object)GetValue(CommandParameterProperty);}set{SetValue(CommandParameterProperty, value);}}public static readonly DependencyProperty CommandTargetProperty =DependencyProperty.Register("CommandTarget",typeof(IInputElement),typeof(MyCommands),new PropertyMetadata((IInputElement)null));public IInputElement CommandTarget{get{return (IInputElement)GetValue(CommandTargetProperty);}set{SetValue(CommandTargetProperty, value);}}public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(MyCommands), new PropertyMetadata(new PropertyChangedCallback(OnCommandChanged)));public ICommand Command{get { return (ICommand)GetValue(CommandProperty); }set { SetValue(CommandProperty, value); }}#region ICommand Memberspublic bool CanExecute(object parameter){if (Command != null)return Command.CanExecute(CommandParameter);return false;}public void Execute(object parameter){Command.Execute(CommandParameter);}public event EventHandler CanExecuteChanged;private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){MyCommands commandReference = d as MyCommands;ICommand oldCommand = e.OldValue as ICommand;ICommand newCommand = e.NewValue as ICommand;if (oldCommand != null){oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged;}if (newCommand != null){newCommand.CanExecuteChanged += commandReference.CanExecuteChanged;}}#endregion#region Freezableprotected override Freezable CreateInstanceCore(){throw new NotImplementedException();}#endregion}

在xaml中调用的方法

<UserControl.Resources><unititys:MyCommands x:Key="aaa" Command="{Binding Path=aaa}"/>
</UserControl.Resources><ContextMenu x:Key="RouterMenu1" DataContext="{Binding RelativeSource={RelativeSource Mode=Self}, Path=PlacementTarget.DataContext}"><MenuItem Header="调用aaa" Command="{StaticResource aaa}"></MenuItem></ContextMenu>

在ViewModel中和普通的Command一样的调用就行了

转载于:https://www.cnblogs.com/chenjinshi/p/4645081.html

wpf mvvm MenuItem的Command事件相关推荐

  1. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...

    WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正 ...

  2. 从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator?

    从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator? 原文:从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator? 从PRISM开始学 ...

  3. C# WPF MVVM模式Prism框架下事件发布与订阅

    01 - 前言 处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Prism提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事 ...

  4. .NET Core 3 WPF MVVM框架 Prism系列之事件聚合器

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 一.事件聚合器  在上一篇 .NET Core 3 WPF MVVM框架 Prism系列之模块化 ...

  5. c#事件的发布-订阅模型_NET Core 3 WPF MVVM框架 Prism系列之事件聚合器

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 一.事件聚合器#  在上一篇 .NET Core 3 WPF MVVM框架 Prism系列之模块化 ...

  6. C# WPF MVVM模式Caliburn.Micro框架下事件发布与订阅

    01 - 前言 处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Caliburn提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间 ...

  7. C# WPF MVVM模式Prism框架从零搭建(经典)

    01 - 前言 目前最新的PRISM的版本是8.1.97,本节以6.3.0.0 讲解,可以在Github上获取PRISM的源码. Prism Github地址:https://github.com/P ...

  8. (WPF, MVVM) Event 处理

    原文:(WPF, MVVM) Event 处理 WPF的有些UI元素有Command属性可以直接实现绑定,如Button 但是很多Event的触发如何绑定到ViewModel中的Command呢? 答 ...

  9. WPF MVVM实例三

    在没给大家讲解wpf mwm示例之前先给大家简单说下MVVM理论知识: WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时 ...

最新文章

  1. 阿里、腾讯、美团、小米……各公司月饼大PK,看完简直想哭泣!
  2. 再见了Excel,我有Python了,不用天天加班了
  3. 学习.NET的两个网站:MSDN和Asp .NET
  4. 台积电要造第一款7nm芯片 明年下半年可投产
  5. ArcGIS实验教程——实验三十六:ArcGIS Python脚本的巧妙使用
  6. stomp 连接错误: Whoops! Lost connection to http://localhost:8080/spring13/stomp 的解决方法
  7. nginxlua文件服务器权限,通过lua进行nginx的权限控制
  8. 猜数字游戏(Java)
  9. 计算机图形学(一) 视频显示设备_3_随机扫描显示器
  10. 禁止特定IP访问Oracle数据库
  11. 最常被利用的三大 API 漏洞:是什么、为什么、如何阻止?
  12. 计算机组成原理—高速缓冲存储器
  13. 支持多浏览器的js拖拽 (转domkey0303 的blog)
  14. mac 安装 mongo 及基本命令
  15. word中如何去掉页眉横线?
  16. poi合并docx文档
  17. JavaScript中如何删除节点?
  18. Uber vs. Lyft
  19. 我的母校照片~~``
  20. Chrome 55 浏览器推出 Android 离线下载功能

热门文章

  1. 第一次软工作业展示——潘学
  2. 如何在工作组环境win 7远程管理Hyper-v server R2 SP1配置(三)
  3. 如何利用System.Net.Mail类发送EMAIL
  4. Android入门逆引手册 - 12 评分条(RatingBar)的使用
  5. chrome中Google插件导出导入
  6. Creating Apps With Material Design —— Creating Lists and Cards
  7. edoc2中标电子文件管理标准ERMS制定项目
  8. RDIFramework.NET(.NET快速开发框架) 答客户问(2014-02-23)
  9. WorldWind Java 版学习:1、启动过程
  10. Activit系列之---Activity的生命周期