原文:整理: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的同时也触发了动画效果

最新文章

  1. gulp配置文件备份
  2. 学习angularjs时遇到 XX is not a function
  3. SQL SERVER 2008 如何查询含有某关键词的表
  4. WinForm中动态添加控件 出现事件混乱,解决办法记录。
  5. LoadImage 和 BitBlt
  6. Oracle start with.connect by prior子句实现递归查询
  7. oracle导入数据
  8. 第九十四节,html5+css3移动手机端流体布局,旅游部分,媒体查询
  9. hadoop1.2.1 MultipleOutputs将结果输出到多个文件或文件夹
  10. Python3中的模块
  11. [经验分享] OSCP 渗透测试认证
  12. css之overflow应用
  13. adobe air for ios 例子
  14. Linux搜索文件或内容
  15. flex属性的学习
  16. hdu2509 Be the Winner 博弈
  17. NET Core 1.1 版本项目和2.0环境下的项目开发注意事项
  18. java IO包的其他类
  19. PHP通过日志来发现问题
  20. UI- UIView控件知识点回顾

热门文章

  1. Mysql高性能优化规范
  2. ASP.NET----内置对象----Response
  3. 【Spring Boot】Spring Boot之使用 Spring Boot Configuration Processor 完成设置自定义项目属性自动补全
  4. Java中基本数据类型、不能用浮点数表示金额
  5. Linux文本编辑器Vim使用
  6. 性能测试基础---ant集成1
  7. 1. 观察者模式总结(C++)
  8. vue-router模式history与hash
  9. LuoguP5540:【模板】最小乘积生成树(几何逼近)
  10. Quay: Introducing an Application Registry for Kubernetes