整理:WPF用于绑定命令和触发路由事件的自定义控件写法
原文:整理:WPF用于绑定命令和触发路由事件的自定义控件写法
目的:自定义一个控件,当点击按钮是触发到ViewModel(业务逻辑部分)和Xaml路由事件(页面逻辑部分)
自定义控件增加ICommand
-
#region - 用于绑定ViewModel部分 -
-
-
public ICommand Command
-
{
-
get { return (ICommand)GetValue(CommandProperty); }
-
set { SetValue(CommandProperty, value); }
-
}
-
-
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
-
public static readonly DependencyProperty CommandProperty =
-
DependencyProperty.Register("Command", typeof(ICommand), typeof(MyUserControl), new PropertyMetadata(default(ICommand)));
-
-
public object CommandParameter
-
{
-
get { return (object)GetValue(CommandParameterProperty); }
-
set { SetValue(CommandParameterProperty, value); }
-
}
-
-
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
-
public static readonly DependencyProperty CommandParameterProperty =
-
DependencyProperty.Register("CommandParameter", typeof(object), typeof(MyUserControl), new PropertyMetadata(default(object)));
-
-
public IInputElement CommandTarget { get; set; }
-
-
#endregion
自定义增加路由事件
-
#region 用于Xaml触发路由事件部分
-
-
//声明和注册路由事件
-
public static readonly RoutedEvent MyEventRoutedEvent =
-
EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(EventHandler<RoutedEventArgs>), typeof(MyUserControl));
-
//CLR事件包装
-
public event RoutedEventHandler MyEvent
-
{
-
add { this.AddHandler(MyEventRoutedEvent, value); }
-
remove { this.RemoveHandler(MyEventRoutedEvent, value); }
-
}
-
-
//激发路由事件,借用Click事件的激发方法
-
-
protected void OnMyEvent()
-
{
-
RoutedEventArgs args = new RoutedEventArgs(MyEventRoutedEvent, this);
-
this.RaiseEvent(args);
-
}
-
-
#endregion
自定义控件中增加一个按钮,当按钮点击时触发绑定的命令和路由事件
-
/// <summary> 内部触发的路由事件和自定义命令方法 </summary>
-
private void Button_Click(object sender, RoutedEventArgs e)
-
{
-
//命令作用于命令目标
-
if (this.Command != null)
-
{
-
this.Command.Execute(CommandParameter);
-
-
this.OnMyEvent();
-
}
-
}
Xaml部分绑定ICommand和触发RoutedEvent
-
<local:MyUserControl Grid.Row="1" Command="{Binding RelayCommand}" CommandParameter="Sumit">
-
<local:MyUserControl.Triggers>
-
<EventTrigger RoutedEvent="local:MyUserControl.MyEvent">
-
<BeginStoryboard>
-
<Storyboard>
-
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="0" To="1" BeginTime="00:00:00" Duration="00:00:01"/>
-
</Storyboard>
-
</BeginStoryboard>
-
</EventTrigger>
-
</local:MyUserControl.Triggers>
-
</local:MyUserControl>
Command用于绑定ViewModel中的Command
EventTrigger用于注册路由事件
效果:当点击内部按钮是触发了ViewModel的同时也触发了动画效果
整理:WPF用于绑定命令和触发路由事件的自定义控件写法的更多相关文章
- ComboBox绑定数据源时触发SelectedIndexChanged事件的处理办法
转载:http://blog.sina.com.cn/s/blog_629e606f01014d4b.html ComboBox最经常使用的事件就是SelectedIndexChanged.但在将Co ...
- WPF手动触发路由事件
MouseButtonEventArgs args = , MouseButton.Left); args.RoutedEvent = UIElement.MouseLeftButtonDownEve ...
- WPF 自定义一个控件,当点击按钮是触发到ViewModel(业务逻辑部分)和Xaml路由事件(页面逻辑部分)
#region - 用于绑定ViewModel部分 - public ICommand Command { get { return (ICommand)GetValue(CommandPropert ...
- 迟到的 WPF 学习 —— 路由事件
1. 理解路由事件:WPF 通过事件路由(event routing)概念增强了传统的事件执行的能力和范围,允许源自某个元素的事件由另一个元素引发,例如,事件路由允许工具栏上的一个按钮点击的事件在被代 ...
- 细说WPF自定义路由事件
WPF中的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件. 1.WPF内置路由事件 W ...
- WPF自学入门(三)WPF路由事件之内置路由事件
有没有想过在.NET中已经有了事件机制,为什么在WPF中不直接使用.NET事件要加入路由事件来取代事件呢?最直观的原因就是典型的WPF应用程序使用很多元素关联和组合起来,是否还记得在WPF自学入门(一 ...
- WPF Demo18 路由事件
using System.Windows; namespace 路由事件2 { public class Student { ////声明并定义路由事件 //public static readonl ...
- WPF - 善用路由事件
原文:WPF - 善用路由事件 在原来的公司中,编写自定义控件是常常遇到的任务.但这些控件常常拥有一个不怎么好的特点:无论是内部还是外部都没有使用路由事件.那我们应该怎样宰自定义控件开发中使用路由事件 ...
- WPF中自定义路由事件
public class MyButtonSimple: Button { // Create a custom routed event by first registering a RoutedE ...
随机推荐
- 简要分析一下java中线程的生命周期
面试题:您了解线程吗?简单叙述一下线程的生命周期? 答:之前学过一些有关于线程方面的知识,并且在编写代码的过程中还是要经常考虑线程,所以,我对线程还是了解一点的. 首先,创建一个线程,线程进入初始状态 ...
- mysql foreignkey
1.foreign key 当数据足够大的时候,字段会出现大量重复, 解决:额外定义一个大量冗余的字段表,(有id) 一张是关联表(从表),一张是被关联表(主表) 进行关联的时候 ,先创建被关联表, ...
- amp加载速度比标准移动页面快85%
6月13日,谷歌合作伙伴大会上Oliver Vidinovski先生(Google Global Head of eCommerce - CS/GCS) 释放了一个信息:amp加载速度比标准移动页面快 ...
- 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL 介绍
原文地址
- Java 基本类型、封装类型、常量池、基本运算
基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~3 ...
- 移动端事件(touchstart、touchmove、touchend)--移动端开发整理笔记(三)
移动端事件 三个事件 touchstart 手指触摸 相当于PC端 mousedown touchend 手指抬起 相当于PC端 mouseup touchmove 手指滑动 相当于PC端 mousm ...
- 阿里云centos 7上面安装mysql5.7的详细步骤!!!
前言: 网上太多的linux 的安装mysql教程,很多教程不全或者因为环境不一致导致无法成功安装,以下是亲测的可行性的方法,请参考. 步骤: Centos7操作系统YUM库列表里默认不再提供MySQ ...
- 踩iviewui中Tabs 标签页数据绑定坑
今天小颖要实现点击Tabs 标签页中每个标签,并动态获取当前点击的标签值. 一句话说不清楚,那就看动态图吧 小颖一开始看官网写的代码是: <template> <Tabs :valu ...
- C++ 派生类覆盖重载基类函数
派生类希望基类重载函数可见,情况有三种: a)派生类中覆盖某个版本,则某个版本可见,全部都覆盖重写,则全部版本可见. b)派生类中一个也不覆盖,则全部基类版本可见. c)派生类需要添加新的重载版本,同 ...
- valgrind memcheck使用方法及效果(转)
https://windmissing.github.io/linux/2016-02/valgrind-memcheck.html 一.valgrind 1. Valgrind是什么 Valgrin ...