原文:整理:WPF中应用附加事件制作可以绑定命令的其他事件

目的:应用附加事件的方式定义可以绑定的事件,如MouseLeftButton、MouseDouble等等

一、定义属于Control的附加事件ControlAttachEvent类


  1. /// <summary> 附加事件 </summary>
  2. public static class ControlAttachEvent
  3. {
  4. #region - 双击事件 -
  5. public static readonly DependencyProperty PreviewMouseDoubleClickProperty =
  6. DependencyProperty.RegisterAttached("PreviewMouseDoubleClick", typeof(ICommand), typeof(ControlAttachEvent), new FrameworkPropertyMetadata(OnCommandChanged));
  7. public static ICommand GetPreviewMouseDoubleClick(Control target)
  8. {
  9. return (ICommand)target.GetValue(PreviewMouseDoubleClickProperty);
  10. }
  11. public static void SetPreviewMouseDoubleClick(Control target, ICommand value)
  12. {
  13. target.SetValue(PreviewMouseDoubleClickProperty, value);
  14. }
  15. private static void Element_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
  16. {
  17. Control control = sender as Control;
  18. ICommand command = GetPreviewMouseDoubleClick(control);
  19. if (command.CanExecute(sender))
  20. {
  21. command.Execute(sender);
  22. e.Handled = true;
  23. }
  24. }
  25. private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  26. {
  27. Control control = d as Control;
  28. control.PreviewMouseDoubleClick += new MouseButtonEventHandler(Element_PreviewMouseDoubleClick);
  29. }
  30. #endregion
  31. public static DependencyProperty PreviewMouseLeftButtonDownCommandProperty = DependencyProperty.RegisterAttached("PreviewMouseLeftButtonDown",typeof(ICommand),typeof(ControlAttachEvent),new FrameworkPropertyMetadata(null, new PropertyChangedCallback(PreviewMouseLeftButtonDownChanged)));
  32. public static void SetPreviewMouseLeftButtonDown(DependencyObject target, ICommand value)
  33. {
  34. target.SetValue(PreviewMouseLeftButtonDownCommandProperty, value);
  35. }
  36. public static ICommand GetPreviewMouseLeftButtonDown(DependencyObject target)
  37. {
  38. return (ICommand)target.GetValue(PreviewMouseLeftButtonDownCommandProperty);
  39. }
  40. private static void PreviewMouseLeftButtonDownChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
  41. {
  42. FrameworkElement element = target as FrameworkElement;
  43. if (element != null)
  44. {
  45. if ((e.NewValue != null) && (e.OldValue == null))
  46. {
  47. element.PreviewMouseLeftButtonDown += element_PreviewMouseLeftButtonDown;
  48. }
  49. else if ((e.NewValue == null) && (e.OldValue != null))
  50. {
  51. element.PreviewMouseLeftButtonDown -= element_PreviewMouseLeftButtonDown;
  52. }
  53. }
  54. }
  55. private static void element_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  56. {
  57. FrameworkElement element = (FrameworkElement)sender;
  58. ICommand command = (ICommand)element.GetValue(PreviewMouseLeftButtonDownCommandProperty);
  59. command.Execute(sender);
  60. }
  61. }

说明:当控件MyControl中应用该项附加事件,如注册PreviewMouseDoubleClick事件,则会触发更新方法OnCommandChanged,而在更新方法中则会注册该控件MyControl的双击事件绑定的命令,由此实现双击该控件触发绑定命令的功能;

二、调用方法

  <Button  base:ControlAttachEvent.PreviewMouseDoubleClick="{Binding RelayCommand}"/>

如上代码当双击Button时会触发ViewModel中绑定的RelayCommand命令

注:

优点在于可以把控件中不支持绑定的事件支持绑定,同时应用附加属性复用性更强

缺点在于传递事件的参数只有sender,agrs需要特殊处理,同时支持的事件与Control有关,其他更上层的控件需要单独定义

整理:WPF中应用附加事件制作可以绑定命令的其他事件的更多相关文章

  1. 转:WPF中ListBox的创建和多种绑定用法

    先从最容易的开始演示ListBox控件的创建. Adding ListBox Items下面的代码是向ListBox控件中添加多项ListBoxItem集合.XAML代码如下:<ListBox ...

  2. 在WPF中一种较好的绑定Enums数据方法

    引言 在你使用wpf应用程序开发的时候,是否需要进行数据绑定到Enum数据呢?在这篇文章中,我将向你展示在WPF中处理Enum数据绑定的方法. 假设存在一个这样的Enum数据的定义,具体内容如下文代码 ...

  3. jsp中一个标签两种方式绑定两个click事件导致未执行的问题

    近日,在开发过程中,写了一个标签 <li id="a1" onclick="doSomething()">...</li> 在js页面中 ...

  4. WPF中,Combox的SelectedItem属性绑定成功后,未能默认显示上一次选择的结果。

    问题描述: Combox中,设定了绑定对象,但是在第一次进入时却没有显示上次选中的项.      1)查看SelectedItem对应绑定的值,也是有的(启动时,读取上次设置的结果,来初始化界面). ...

  5. WPF中DataGrid的ComboBox的简单绑定方式(绝对简单)

    在写次文前先不得不说下网上的其他wpf的DataGrid绑定ComboBox的方式,看了之后真是让人欲仙欲死. 首先告诉你一大堆的模型,一大堆的控件模板,其实或许你紧紧只想知道怎么让combobox怎 ...

  6. WPF中使用相对资源来进行绑定,数据源是通过DataContext来指定的

    1. 最外层是Window是对象,Window的ItemsControl使用了ItemsTemplate,然后在ItemsTemplate中要绑定Language属性, 而整个Window的数据源是通 ...

  7. 01.WPF中制作无边框窗体

    [引用:]http://blog.csdn.net/johnsuna/article/details/1893319   众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormB ...

  8. WPF中制作无边框窗体

    原文:WPF中制作无边框窗体 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormBorderStyle属性设置为None来完成.如果要制作成异形窗体,则需要使用图片或者使用G ...

  9. 整理:WPF中Binding的几种写法

    原文:整理:WPF中Binding的几种写法 目的:整理WPF中Bind的写法 <!--绑定到DataContext--> <Button Content="{Bindin ...

随机推荐

  1. Spring项目配置多数据源

    项目中有用到多数据源,并进行动态切换,使用的是阿里的druid.看网上有一篇大致一样的就偷偷懒 import java.sql.SQLFeatureNotSupportedException; imp ...

  2. ORM之EF初识

    之前有写过ef的codefirst,今天来更进一步认识EF! 一:EF的初步认识 ORM(Object Relational Mapping):对象关系映射,其实就是一种对数据访问的封装.主要实现流程 ...

  3. python 和 R 语言中的等差数列

    等差数列的通项公式:an = a0 + n*d. 数学上 n 是可以取遍整个整个正整数集的,在现实中,n  是有范围的. 1.R 语言用 seq()  函数产生等差数列: 2.python 中 ran ...

  4. flask实战-个人博客-数据库-生成虚拟数据 --

    3.生成虚拟数据 为了方便编写程序前台和后台功能,我们在创建数据库模型后就编写生成虚拟数据的函数. 1)管理员 用于生成虚拟管理员信息的fake_admin()函数如下所示: personalBlog ...

  5. 201800628模拟赛T2——最大土地面积

    题目描述 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. 输入输出格式 输入格式: 第1行一个正整数N,接下来N行,每行2个数x,y ...

  6. android 发布时去除Log

    1) project.properties文件里,去掉下面一行的注释: # To enable ProGuard to shrink and obfuscate your code, uncommen ...

  7. 25-C#笔记-文件的输入输出

    1. 写txt FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileSh ...

  8. 第05组 Beta冲刺(2/4)

    第05组 Beta冲刺(2/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了哪 ...

  9. BBS项目-01

    目录 BBS项目 BBS开发流程: BBS表格创建: BBS项目 BBS开发流程: BBS项目: 开发流程: 需求分析 草拟一些项目的大致技术点和流程 架构设计 架构师(框架 语言 数据库 缓存数据库 ...

  10. 使用nodejs编写cli工具

    1.创建一个文件夹(my-cli); 2.在当前文件夹打开命令行输入 npm init,创建一个package.json,并配置bin字段,配置后才可以在控制台使用你的命令 "bin&quo ...