第三篇会是我们讨论的终章。希望文中关于依赖属性和数据绑定的使用,能够抛砖引玉,各位各抒己见给我一些启迪。

  首先我们看一下最终的XAML,可能在看到XAML后各位已经猜出了具体的实现。这次我又增加了第四个Rectangle,颜色是Gray。同时对该Rectangle设置了Name=“rect”。

<Rectangle x:Name="rect" Width="100" Height="100" Fill="Gray"></Rectangle>
<local:ElementBinder EventName="MouseLeftButtonDown" Command="{Binding ViewModel.MouseLeftDownCommand, ElementName=window}"Parameter="{Binding ElementName=rect}"Target="{Binding ElementName=rect}">
</local:ElementBinder>

  我们注意到其实ElementBinder并不是Rectangle的属性,而仅仅是ElementBinder中的Target属性绑定了Rectangle。

  这其中的不同在于ElementBinder是继承自FrameworkElement,而其中的EventName、Command、Parameter和Target都从附加属性变成了普通的依赖属性。不再附加到其他的某个DependencyObject之上,而仅仅是作为ElementBinder的属性存在。之所以继承自FrameworkElement,是因为在该类提供了数据绑定的能力,如果继承自UIElement就无法实现Binding的功能了。

  其实ElementBinder这个类写在XAML里,并没有和任何的控件产生关联,之所以可以绑定Command到Rectangle,是因为新增的Target属性。通过该属性才取得了与某个UIElement(这里是Rectangle)的联系。

        public UIElement Target{get { return (UIElement)GetValue(TargetProperty); }set { SetValue(TargetProperty, value); }}// Using a DependencyProperty as the backing store for Target.  This enables animation, styling, binding, etc...public static readonly DependencyProperty TargetProperty =DependencyProperty.Register("Target", typeof(UIElement), typeof(ElementBinder), new UIPropertyMetadata(ChangedCallback));private static void ChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e){UIElement element = d.GetValue(TargetProperty) as UIElement;if (element != null){string eventName = d.GetValue(EventNameProperty) as string;if (eventName != null){EventInfo eventInfo = element.GetType().GetEvent(eventName);var handler = new MouseButtonEventHandler((sender, arg) =>{object obj = d.GetValue(ParameterProperty);ICommand command = d.GetValue(CommandProperty) as ICommand;command.Execute(obj);});var del = handler.GetInvocationList()[0];eventInfo.AddEventHandler(element, del);}}}

  在代码中我们首先找到了ElementBinder对象的Target属性,取得Target属性的值,也正是我们希望关联的控件Rectangle,之后的逻辑和前面一篇是一样的。

  本来是没有打算写第三篇的,这个通过FrameworkElement建立关联来绑定的思路也不是我想到的,是得到上篇提到的微软哥韦恩卑鄙给出的解决方案。在学习了之后我也分享给大家。

  链接包含了文中所用到的代码,我总共创建了4个Rectangle,又用了4种不同的方式去关联Command,如果各位闲暇之余想出了“回字的第5种写法”,望不吝赐教。

  http://files.cnblogs.com/manupstairs/TestDPWpf.7z

转载于:https://www.cnblogs.com/manupstairs/archive/2012/11/10/2764232.html

通过Attached Property给控件绑定Command(三)相关推荐

  1. 通过Attached Property给控件绑定Command(二)

    上一篇我们提到希望建立一个通用的Command绑定,本篇就这个问题来和各位进行讨论.也希望各位能指出不足,提出改进的建议. 我希望最终实现的效果如下图所示,可以给任何一个Control绑定Comman ...

  2. repeater控件 php,Repeater控件绑定的三种方式

    方式一 在aspx页面,写好需要循环输出的内容,一般包含用户自定义控件.服务器控件.Html格式的片段.和这种方式来动态显示获取到得数据列表: "> class="" ...

  3. QT给控件绑定数据:setProperty

    setProperty().property()函数 bool setProperty(const char *name, const QVariant &value); QVariant p ...

  4. WPF中一个控件绑定另一个控件的属性

    原文:WPF中一个控件绑定另一个控件的属性 如同一个Grid中的一个按钮根据另一个按钮的显示与否作出不同的响应: 绑定的时候通过ElementName来指定控件 <Grid Margin=&qu ...

  5. .Net平台Winform两个ComboBox控件绑定同一个数据源

    今天WINFROM编程遇到这么一个问题:是有关WINFORM中两个comboBox控件绑定同一个数据源的问题,在窗体的界面上有两个comboBox,我在Form1_Load中对他们做了数据绑定(具体代 ...

  6. Devexpress TreeList控件绑定显示父子节点对像

    今天一位同事咨询Devexpress TreeList控件绑定自动显示父子节点对像,但结果是不会显示带父子节点关系,而是将所有的节点作为父节点显示出来了,对像类的代码如下 public class I ...

  7. Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定)

    原文:Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定) ------------------------------ ...

  8. Winform开发之ComboBox和ComboBoxEdit控件绑定key/value数据

    使用 ComboBox 控件绑定key/value值: 因为 ComboBox 是有 DataSource 属性的,所以它可以直接绑定数据源,如 DataTable.ListItem 等. 使用 Da ...

  9. Asp.net--DropDownList控件绑定数据库数据

    DropDownList控件绑定数据库数据:DB是公共类,reDt是公共类中的方法 放在Page_Load事件中 if (!IsPostBack){DB db = new DB();DataTable ...

最新文章

  1. 线性模型已退场,XGBoost时代早已来
  2. HTML5实践 -- 使用css装饰你的图片画廊 - part2
  3. Kafka如果丢了消息,怎么处理的?
  4. share_from_this
  5. 用 Java 实现断点续传 (HTTP)
  6. mysql的含义及特点_MySQL——基本概念
  7. bom .dom_MicroProfile 2.2 BOM导入支持
  8. spring集合的注入
  9. 汪洋大海中的一块绿地
  10. 合作、高效 -- 下一代汽车电子软件开发与测试论坛
  11. 时间戳转化为YYYY-MM-DD-XX-MM-UU日期格式
  12. Android数字签名机制和应用场景
  13. Laravel框架简介与环境搭建
  14. matlab 符号函数 计算,MATLAB符号计算函数用法总结
  15. 2021全国特种设备-G3锅炉水处理模拟考试题库一[安考星]
  16. 用户邀请码的生成方法
  17. holder.js如何使用
  18. MM们必败潮物。。。。大眼睛的小秘密哦```````
  19. LabVIEW 调用 BarTender 进行标签打印
  20. 修复iPhone系统故障导致的黑屏

热门文章

  1. 九号机器人田奇峰_九号公司成功登陆科创板
  2. php 记录报错,php报错自己记录
  3. java session失效之后跳转,session失效后如何实现页面不跳转到主页而是跳转到session失效时的页面...
  4. 计算机专业的口号运动会四字,计算机系运动会口号
  5. java md5 utf-8_Jquery与java MD5加密不同
  6. 备忘录怎么用红笔标注_备忘录丢失怎么找回来?教你轻松玩转备忘录
  7. 什么是网络计算机有什么优点,ISDN是什么?它有什么优点?
  8. python接收最新邮件_Python接收Gmail新邮件并发送到gtalk的方法
  9. flask mysql 配置文件_Flask配置文件
  10. matplotlib散点图点大小_机器学习Web应用:matplotlib教程