系列目录:

MVVM模式解析和在WPF中的实现(一)MVVM模式简介

MVVM模式解析和在WPF中的实现(二)数据绑定

MVVM模式解析和在WPF中的实现(三)命令绑定

MVVM模式解析和在WPF中的实现(四)事件绑定

MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

MVVM模式解析和在WPF中的实现(六)用依赖注入的方式配置ViewModel并注册消息

0x00 为什么要事件绑定

这个问题其实是很好理解的,因为事件是丰富多样的,单纯的命令绑定远不能覆盖所有的事件。例如Button的命令绑定能够解决Click事件的需求,但Button的MouseEnter、窗体的Loaded等大量的事件要怎么处理呢?这就用到了事件绑定。

0x01 事件绑定

要使用事件绑定需要借助System.Windows. interactivity,如果安装了Blend,里面就包含了这个dll。需要在Interaction.Triggers里面添加一个或多个EventTrigger并指定关注的的事件名称,在EventTrigger中通过InvokeCommandAction来绑定事件对应的命令。图中所示绑定了主窗口的Loaded事件,在事件触发后会调用绑定的命令对象LoadedCommand的Execute方法执行命令,当命令绑定需要参数时可以通过绑定CommandParameter实现。需要指出的是之前在实现MyCommand的Execute方法时我们加入了CanExecute的判断,因此事件触发后是否能够真正执行绑定的命令也受到绑定的LoadedCommand的CanExecute方法的影响。

0x02 带EventArgs参数的事件绑定

上面介绍的事件绑定并不足以应对所有的情况,因为很多情况下我们还需要从事件的EventArgs中获取数据,例如从MouseMove事件参数中获取鼠标位置和按键状态等。但InvokeCommandAction在未对CommandParameter绑定的情况下给Execute方法传递的参数为null。因此我们需要自己写一个类来处理事件到命令的绑定。

看一下上面我们用到的InvokeCommandAction,继承自TriggerAction<DependencyObject>,TriggerAction是一个抽象类,我们只要继承这个类并实现Invoke方法即可。TriggerAction在MSDN中的介绍如下:

https://msdn.microsoft.com/zh-cn/library/system.windows.interactivity.triggeraction(v=expression.40).aspx

我简单实现了以下,代码如下图所示,其中依赖项属性是借助propdp代码段生成的,要不实在记不住,输入那么多代码也好麻烦。使用的时候用来代替之前的InvokeCommandAction,不绑定CommandParameter则传递的就是事件的参数。如果绑定了CommandParameter,那么传递的就是绑定的参数。

0x03 事件绑定的示例

有了MyEventCommand我们就可以绑定事件并获取事件参数了。实例中绑定了窗体的Loaded事件和MouseMove事件,其中在MouseMove事件中我们使用自己的MyEventCommand对象接收事件对象,并显示出鼠标相对于窗体的位置以及各个按键的状态。

示例程序运行后如下所示

0x04 相关下载

https://github.com/durow/TestArea/tree/master/MVVMTest/EventBindingTest

MVVM设计模式和在WPF中的实现(四) 事件绑定相关推荐

  1. WPF中的命令与命令绑定(二)

    WPF中的命令与命令绑定(二)                                              周银辉 在WPF中,命令(Commanding)被分割成了四个部分,分别是IC ...

  2. LibVLCSharp在WPF中无法响应鼠标事件

    问题原因 官方LibVLCSharp库的VideoView在WPF中其实还是使用的Win32控件 WPF控件会被Win32控件遮挡,所以无法响应鼠标事件. 解决办法 在VideoView控件上添加一层 ...

  3. DICOM:再次剖析fo-dicom中DicomService的自定义事件绑定

    题记: 趁着<从0到1>大火的热潮,近期重新翻阅了一遍<从一到无穷大>(这样是不是感觉整个非负数轴就圆满了^_^).虽然作为科普类书籍,但是里面的内容还是比较深奥,幸亏有作者精 ...

  4. magix中的2种事件绑定方式

    可操作html与js magix采用html与js文件分离的写法,当我们在阅读时,希望能直观的看出节点绑定了哪些事件或这个函数是为哪种事件服务的. 如下html <div><butt ...

  5. Windows Phone DataBound ListBox中针对UIElement的事件绑定(Button)

    在很多使用DataBound的ListBox案例中,我们都监听了它的 SelectionChanged 事件,当我们用手指点击某一项时,可以从 ListBox.SelectedItem 属性上很容易获 ...

  6. 【转】在WPF中自定义控件

    周银辉的开发博客(WPF) 在WPF中自定义控件(1) 一, 不一定需要自定义控件 在使用WPF以前,动辄使用自定义控件几乎成了惯性思维,比如需要一个带图片的按钮,但在WPF中此类任务却不需要如此大费 ...

  7. [转]在WPF中自定义控件 UserControl

    在这里我们将将打造一个UserControl(用户控件)来逐步讲解如何在WPF中自定义控件,并将WPF的一些新特性引入到自定义控件中来. 我们制作了一个带语音报时功能的钟表控件, 效果如下: 在VS中 ...

  8. WPF中的路由事件(转)

    出处:https://www.cnblogs.com/JerryWang1991/archive/2013/03/29/2981103.html 最近因为工作需要学习WPF方面的知识,因为以前只关注的 ...

  9. 理解Windows窗体和WPF中的跨线程调用

    你曾开发过Windows窗体程序,可能会注意到有时事件处理程序将抛出InvalidOperationException异常,信息为" 跨线程调用非法:在非创建控件的线程上访问该控件" ...

  10. WPF入门教程系列十五——WPF中的数据绑定(一)

    使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能.WPF的数据绑定跟Winform与ASP.NET中的数 ...

最新文章

  1. firefox+linux+nginx搭建server与client通过证书双向认证环境
  2. Cisco asa 5510升级IOS和ASDM
  3. Verilog中生成语句(generate)的用法
  4. 如何为网站设置站点图标
  5. 打破你的认知,数字除以 0 一定会崩溃吗?
  6. NumPy学习笔记(一)
  7. 赞!史上最全的互联网思维精髓总结
  8. 【渝粤教育】国家开放大学2018年春季 3781-22T燃气燃烧技术与设备 参考试题
  9. 前端开发 “性能”有多重要
  10. SQLite性能提升10倍的Web数据库
  11. 【数据结构笔记29】最小生成树问题:Prim算法与Kruskal算法
  12. 历史上华人计算机科学家,郑州大学韩家炜、张宏江两位校友在世界顶尖计算机科学家排名中再度名列华人科学家和中国大陆科学家之首...
  13. 【枚举排列】生成1~n的排列生成可重集的排列
  14. Mac的shell命令大全
  15. hlw8012电能测量芯片(多组功率电流测量)
  16. Python数学建模 空间插值
  17. 2020年最新Django经典面试问题与答案汇总(上)-大江狗整理
  18. 值得收藏的199条经典民间偏方
  19. 如何将瀚高数据库单机数据导入HGDW
  20. java根据经纬度获取详细地址

热门文章

  1. 智能优化算法应用:基于麻雀搜索算法与双伽马校正的图像自适应增强算法 - 附代码
  2. ArcGIS操作总结(更新中......)
  3. IDL | 语句练习
  4. 遥感基础编程语言——IDL的应用
  5. 【GIS】GIS概念
  6. 回顾 | Apache Flink Meetup 杭州站圆满结束(附PPT下载)
  7. flutter系列之flutter工程结构详解(android视角)
  8. 老码农最后都去哪了?
  9. 如何优化你的布局层级结构之RelativeLayout和LinearLayout及FrameLayout性能分析(一)...
  10. Python 必备要点总结及环境搭建(上)