原文:整理:WPF用于绑定命令和触发路由事件的自定义控件写法

目的:自定义一个控件,当点击按钮是触发到ViewModel(业务逻辑部分)和Xaml路由事件(页面逻辑部分)

自定义控件增加ICommand


  1. #region - 用于绑定ViewModel部分 -
  2. public ICommand Command
  3. {
  4. get { return (ICommand)GetValue(CommandProperty); }
  5. set { SetValue(CommandProperty, value); }
  6. }
  7. // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
  8. public static readonly DependencyProperty CommandProperty =
  9. DependencyProperty.Register("Command", typeof(ICommand), typeof(MyUserControl), new PropertyMetadata(default(ICommand)));
  10. public object CommandParameter
  11. {
  12. get { return (object)GetValue(CommandParameterProperty); }
  13. set { SetValue(CommandParameterProperty, value); }
  14. }
  15. // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
  16. public static readonly DependencyProperty CommandParameterProperty =
  17. DependencyProperty.Register("CommandParameter", typeof(object), typeof(MyUserControl), new PropertyMetadata(default(object)));
  18. public IInputElement CommandTarget { get; set; }
  19. #endregion

自定义增加路由事件


  1. #region 用于Xaml触发路由事件部分
  2. //声明和注册路由事件
  3. public static readonly RoutedEvent MyEventRoutedEvent =
  4. EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(EventHandler<RoutedEventArgs>), typeof(MyUserControl));
  5. //CLR事件包装
  6. public event RoutedEventHandler MyEvent
  7. {
  8. add { this.AddHandler(MyEventRoutedEvent, value); }
  9. remove { this.RemoveHandler(MyEventRoutedEvent, value); }
  10. }
  11. //激发路由事件,借用Click事件的激发方法
  12. protected void OnMyEvent()
  13. {
  14. RoutedEventArgs args = new RoutedEventArgs(MyEventRoutedEvent, this);
  15. this.RaiseEvent(args);
  16. }
  17. #endregion

自定义控件中增加一个按钮,当按钮点击时触发绑定的命令和路由事件


  1. /// <summary> 内部触发的路由事件和自定义命令方法 </summary>
  2. private void Button_Click(object sender, RoutedEventArgs e)
  3. {
  4. //命令作用于命令目标
  5. if (this.Command != null)
  6. {
  7. this.Command.Execute(CommandParameter);
  8. this.OnMyEvent();
  9. }
  10. }

Xaml部分绑定ICommand和触发RoutedEvent


  1. <local:MyUserControl Grid.Row="1" Command="{Binding RelayCommand}" CommandParameter="Sumit">
  2. <local:MyUserControl.Triggers>
  3. <EventTrigger RoutedEvent="local:MyUserControl.MyEvent">
  4. <BeginStoryboard>
  5. <Storyboard>
  6. <DoubleAnimation Storyboard.TargetProperty="Opacity" From="0" To="1" BeginTime="00:00:00" Duration="00:00:01"/>
  7. </Storyboard>
  8. </BeginStoryboard>
  9. </EventTrigger>
  10. </local:MyUserControl.Triggers>
  11. </local:MyUserControl>

Command用于绑定ViewModel中的Command

EventTrigger用于注册路由事件

效果:当点击内部按钮是触发了ViewModel的同时也触发了动画效果

整理:WPF用于绑定命令和触发路由事件的自定义控件写法的更多相关文章

  1. ComboBox绑定数据源时触发SelectedIndexChanged事件的处理办法

    转载:http://blog.sina.com.cn/s/blog_629e606f01014d4b.html ComboBox最经常使用的事件就是SelectedIndexChanged.但在将Co ...

  2. WPF手动触发路由事件

    MouseButtonEventArgs args = , MouseButton.Left); args.RoutedEvent = UIElement.MouseLeftButtonDownEve ...

  3. WPF 自定义一个控件,当点击按钮是触发到ViewModel(业务逻辑部分)和Xaml路由事件(页面逻辑部分)

    #region - 用于绑定ViewModel部分 - public ICommand Command { get { return (ICommand)GetValue(CommandPropert ...

  4. 迟到的 WPF 学习 —— 路由事件

    1. 理解路由事件:WPF 通过事件路由(event routing)概念增强了传统的事件执行的能力和范围,允许源自某个元素的事件由另一个元素引发,例如,事件路由允许工具栏上的一个按钮点击的事件在被代 ...

  5. 细说WPF自定义路由事件

    WPF中的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件. 1.WPF内置路由事件   W ...

  6. WPF自学入门(三)WPF路由事件之内置路由事件

    有没有想过在.NET中已经有了事件机制,为什么在WPF中不直接使用.NET事件要加入路由事件来取代事件呢?最直观的原因就是典型的WPF应用程序使用很多元素关联和组合起来,是否还记得在WPF自学入门(一 ...

  7. WPF Demo18 路由事件

    using System.Windows; namespace 路由事件2 { public class Student { ////声明并定义路由事件 //public static readonl ...

  8. WPF - 善用路由事件

    原文:WPF - 善用路由事件 在原来的公司中,编写自定义控件是常常遇到的任务.但这些控件常常拥有一个不怎么好的特点:无论是内部还是外部都没有使用路由事件.那我们应该怎样宰自定义控件开发中使用路由事件 ...

  9. WPF中自定义路由事件

    public class MyButtonSimple: Button { // Create a custom routed event by first registering a RoutedE ...

随机推荐

  1. django rest framework 解析器组件 接口设计,视图组件 (1)

    一.解析器组件 -解析器组件是用来解析用户请求数据的(application/json), content-type 将客户端发来的json数据进行解析 -必须适应APIView -request.d ...

  2. tomcat 多实例部署

    tomcat 配置多个实例 参考文档 聊聊 Tomcat 的单机多实例 https://www.cnblogs.com/mafly/p/tomcat.html 极客学院 Tomcat 8 权威指南 h ...

  3. USACO Hide and Seek

    洛谷 P2951 [USACO09OPEN]捉迷藏Hide and Seek 洛谷传送门 JDOJ 2641: USACO 2009 Open Silver 1.Hide and Seek JDOJ传 ...

  4. 微信小程序 vscode 自动保存 保存自动编译 微信开发者工具崩溃

    修改vscode的自动保存延迟时间,将 auto save delay 选项 修改的长一点.

  5. 关于System.FormatException异常

    什么是FormatException 参数格式无效或复合格式字符串不正确时引发的异常. 继承 Object Exception SystemException FormatException 详细说明 ...

  6. Dijkstra单源点最短路径算法

    学习参考: Dijkstra算法(单源最短路径) 最短路径—Dijkstra算法和Floyd算法 使用的图结构: 邻接矩阵: -1 20 -1 25 80-1 -1 40 -1 -1-1 -1 -1 ...

  7. P3258 [JLOI2014]松鼠的新家题解

    题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有\(n\)个房间,并且有\(n-1\)根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树& ...

  8. vue.config.js 配置 scss,less,sass全局配置 vuecli3

    module.exports = { /* 部署生产环境和开发环境下的URL:可对当前环境进行区分,baseUrl 从 Vue CLI 3.3 起已弃用,要使用publicPath */ public ...

  9. java 集合运算

    package testjavapro; import java.util.BitSet; public class testjavaa { public static void main(Strin ...

  10. redis 键值对 有效期设置

    redis 键值对 有效期设置redis中可以使用expire命令设置一个键的生存时间, 到时间后redis会自动删除它<-----> 类比于javaweb系统临时数据 过期删除功能 ex ...