Binding的亮点

  在WPF中,Binding无处不在,关于Binding的漂亮用法有很多,其主要的设计亮点有二:

  1. Weak Event模式
  2. Converter

  监听B的属性变化,A需要注册B的PropertyChanged事件,.net中事件是强引用,一旦A注册了B的事件,B就持有了一个A的引用。也就是说,如果A不注销B的事件,即使A已经空置,如果B对象存活,垃圾回收器仍不会回收A的内存,在使用中就造成了A的内存泄露。在Binding的使用过程中,可能会出现多级绑定,A->B->C,一个对象也可能绑定多个对象,在对象空置时注销绑定的监听事件是不太现实的,实现起来太过繁琐。这里就期望能有弱事件(Weak Event)模式,即A监听了B的事件后,B不会阻止A的垃圾回收。

直接把A的属性绑定到B的属性上有时也是不太友好的,比如B的属性是string,A的属性是DateTime,在绑定的过程中需要做一定的转换(Convert)。WPF/Silverlight中的Converter是很不错的想法,可以自定义一些转换,在属性间做一些转换工作。

设计

  开始设计实现BindingEngine,首先来解决弱事件的问题。

  在.net中,可以使用WeakReference(弱引用)来监视对象,WeakReference不会阻止对象的垃圾回收。在实际使用中,A注册B的事件后,B持有了A的引用,B对象会阻止A的垃圾回收。直接把B对象变成弱引用对象是不现实的,但可以引入弱引用对象C,让B持有C的引用,C持有A的引用。这样即使没有注销事件监视,C对象仍持有A的引用,但是C对象是弱引用对象,不会阻止A的垃圾回收。

  用一副图表示:

  把用来作为中间传递的C类命名为WeakSource,它的设计如下:

  WeakSource用来隔离A对象,为了内存考虑,它和A对象间是一一对应关系。这样,在监听B的PropertyChanged事件时,原有的b.ProppertyChanged += a.HandlePropertyChanged就变成了b.PropertyChanged += weakSource.HandlePropertyChanged。WeakSource提供了两个静态方法Register和UnRegister来创建和销毁WeakSource,其中的第一个参数object Source就是WeakSource需要封装的A对象。

  Register的第二个参数INotifyPropertyChanged target,就是需要监听的B对象,最后一个参数targetProp是需要监听B对象的属性名。当B的属性值发生变化时,WeakSource会得到通知,为了完成绑定,WeakSource需要把内部封装的A对象对应的属性值设置为B对象绑定属性的新值。

文章来源:http://www.cnblogs.com/Zhouyongh/archive/2011/03/09/1977768.html

转载于:https://www.cnblogs.com/luohengstudy/archive/2013/05/31/3110822.html

WPF Binding相关推荐

  1. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProperty)只能拥有一个binding. 这一点可以通过设置bindi ...

  2. WPF Binding(四种模式)

    WPF Binding(四种模式) 在使用Binding类的时候有4中绑定模式可以选择 BindingMode TwoWay 导致对源属性或目标属性的更改可自动更新对方.此绑定类型适用于可编辑窗体或其 ...

  3. WPF Binding(绑定)详解

    Binding概念理解: WPF为了实现了UI与数据逻辑的解耦,将UI从数据逻辑中分离出来形成Xaml文件,而UI与数据逻辑之间的联系则通过Bingding来实现.Bingding就像UI与数据逻辑之 ...

  4. 为什么这儿TemplateBinding不起作用了—研究WPF Binding(一)

    工作中,写自定义控件,遇到一个奇怪的问题.场景是这样的:一个ListBox或其他ItemsControl显示数据列表,下方一个TextBlock显示列表中选定的值,代码大概是这样的(做了简化): &l ...

  5. 转载:WPF binding

    数据绑定细节 要使用 WPF 数据绑定功能,您必须始终要有目标和源.绑定的目标可以是从 DependencyProperty 派生而来的任何可访问属性或元素,例如 TextBox 控件的 Text 属 ...

  6. Wpf Binding.Path设置

    Binding.Path 获取或设置绑定源属性的路径. 每个绑定通常都具有四个组件:绑定目标对象.目标属性.绑定源,以及要使用的绑定源值的路径.有关这些数据绑定概念的更多信息,请参见数据绑定概述. 使 ...

  7. C#WPF Binding 中的Path什么意思

    <TextBox x:Name="txt1" /> <TextBlock x:Name="txt2" Text="{Binding ...

  8. WPF中的Data Binding调试指南

    点击蓝字"大白技术控"关注我哟 加个"星标★",每日良时,好文必达! WPF中的Data Binding如何Debug? 大家平时做WPF开发,相信用Visua ...

  9. WPF之Binding的三种简单写法

    环境 类代码 public class Person:INotifyPropertyChanged { private string name; public string Name { get { ...

最新文章

  1. 为什么二级菜单会被挡住_武夷红茶为什么是二级茶?我们平时喝的红茶会不会被加了糖?...
  2. 【原创】new和delete
  3. 开关电源仿真与设计基于spice 第2版 中译本_新书推荐 开关电源控制环路设计Christophe Basso 著...
  4. python中打开文件时只允许写入的模式是_详解python中各种文件打开模式
  5. Qt Creator和Visual Studio双环境开发技能攻略
  6. python创建虚拟环境_Python学习笔记:创建Python开发Web程序的虚拟环境
  7. hbase shell查询表中某字段不为空的数据量_HBase工作原理
  8. c语言中变量后减号大于号,大于等于运算符.ppt
  9. 项目总结 -谷粒学院
  10. haneWin NFS服务器配置
  11. 程序员职业发展路线图
  12. java通过经纬度查询位置(调用百度地图API)
  13. 联盛德 HLK-W806 (十二): Makefile组织结构和编译流程说明
  14. 蓝牙鼠标windows linux,解决Ubuntu 18.04与Windows 10双系统蓝牙鼠标连接的问题
  15. SLAM的数学基础(3):几种常见的概率分布的实现及验证
  16. BatchNormalization 介绍
  17. 为何国外的人都爱用电子邮箱?注册电子邮箱有哪些好处呢?
  18. 红帽第四季度订阅的强劲增长 整体表现超预期
  19. 1、点评搜索服务推荐系统项目概述
  20. 关于曲面方程的法向量的求法

热门文章

  1. Kali 更新源、更新系统和软件、删除软件和配置
  2. 如何根据两个顺序构造⼀个唯⼀的⼆叉树?
  3. mysql 新建数据库
  4. C++ code:string stream(string流)学习大全
  5. 如何解压tar.xz文件
  6. 计算机复试通知学校,提醒:部分学校复试通知已经出了!教育部关于21考研复试的规定!...
  7. 手机壳鸿蒙,手机壳黑榜发布 真相太惊人!
  8. C++11多线程编程-两个进程轮流打印1~100
  9. [BUUCTF-pwn]——jarvisoj_level0
  10. 液晶电视服务器无响应时间,液晶电视响应速度时间是多少更好啊?