依赖属性和普通属性相比节省内存的原因:对于普通属性,每个对象有需要存储一个普通属性的值,即便是默认值。而依赖属性的默认值是静态的存储在类中的,所有对象都使用同一默认值,所以对于拥有大量属性的控件来说这就大大减少了内存的消耗。而对于非默认值,是有依赖属性所在的DependencyObject中的一个字典保存的,字典的key就是依赖属性,value就是依赖属性的值。

绑定的实现原理:这里说一下思路,DependencyObject中拥有一个字典保存绑定信息,字典的key是依赖属性,value为绑定的值。对于绑定SetBinding方法是关键,他处理保存bingding对象的键值对,如果bingding对象中保存的TargetObject(被绑定对象)实现INotifyPropertyChanged接口,那么监听TargetObject的PropertyChanged事件,TargetObject一旦改变就修改依赖属性的值,这就可以实现了通知。而对于双向绑定,奥秘就在给依赖属性赋值的SetValue(xx,xx)方法中,这个方法中会查找管理绑定的那个字典,当前依赖属性是否绑定了值,如果绑定了并且是双向绑定,就给TargetObject设置新值,实现双向绑定。

参考:模拟实现WPF的依赖属性及绑定通知机制(3)--依赖对象

附加属性:其实附加属性也是有依赖属性实现的,比如TextBlock设置了Grid.Row这一附加属性,代码实现:Grid.SetRow(textBlock,1);

SetRow()的实现:

public static void SetRow(UIElement element,int value){

    return element.SetValue(Grid.RowProperty,value);

}

由此可见Grid.Row这一附加属性,添加在TextBlock上时,其值也是保存在TextBlock对象里面管理依赖属性键值对的字典上的。

这只是个人近期学习体会,再加上一点点猜想,有错欢迎提出,共同学习。有时间尝试自己实现以下依赖属性以及绑定。

  

wpf依赖属性、绑定实现原理、附加属性学习的更多相关文章

  1. WPF依赖属性(续)(2)依赖属性与附加属性的区别

    原文:WPF依赖属性(续)(2)依赖属性与附加属性的区别        接上篇,感谢各位的评论,都是认为依赖属性的设计并不是为了节省内存,从大的方面而讲是如此.样式,数据绑定,动画样样都离不开它.这篇 ...

  2. WPF 依赖属性与依赖对象

    在介绍依赖属性之前,我先介绍下属性的历史 属性的历史:      早期C++的类中,只有字段及方法,暴露数据靠的是方法, 但是字段直接暴露会不安全,所以才用方法来暴露,在设置的时候加些约束,在MFC中 ...

  3. WPF自学入门(五)WPF依赖属性

    在.NET中有事件也有属性,WPF中加入了路由事件,也加入了依赖属性.最近在写项目时还不知道WPF依赖属性是干什么用的,在使用依赖项属性的时候我都以为是在用.NET中的属性,但是确实上不是的,通过阅读 ...

  4. WPF依赖属性(续)(3)依赖属性存储

    原文:WPF依赖属性(续)(3)依赖属性存储          在之前的两篇,很多朋友参与了讨论,也说明各位对WPF/SL计数的热情,对DP系统各抒已见,当然也出现了一些分歧. 以下简称DP为依赖属性 ...

  5. WPF依赖属性的正确学习方法

    前言 我在学习WPF的早期,对依赖属性理解一直都非常的不到位,其恶果就是,我每次在写依赖属性的时候,需要翻过去的代码来复制黏贴. 相信很多朋友有着和我相同的经历,所以这篇文章希望能帮助到那些刚刚开始学 ...

  6. WPF依赖属性详解

    WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency P ...

  7. WPF依赖属性值源(BaseValueSource)

    原文:WPF依赖属性值源(BaseValueSource)   WPF依赖属性提供一个机制,可以获取依赖属性提供值的来源 其以BaseValueSource枚举表示 1.Default public ...

  8. WPF依赖属性(续)(1)

    原文:WPF依赖属性(续)(1)                 之前有写过几篇文章,详细地介绍了依赖属性的基本使用方法,如果你不想了解其内部实现机制的话,那么通过那两篇文章的介绍,足以应付平时的应用 ...

  9. 监听WPF依赖属性

    原文:监听WPF依赖属性 当我们使用依赖属性的时候,有时需要监听它的变化,这在写自定义控件的时候十分有用, 下面介绍一种简单的方法.   如下使用DependencyPropertyDescripto ...

  10. WPF 依赖属性前言

    WPF 依赖属性前言 ​ 在.net中,我们可以属性来获取或设置字段的值,不需要在编写额外的get和set方法,但这有一个前提,那就是需要在对象中拥有一个字段,才能在此字段的基础上获取或设置字段的值, ...

随机推荐

  1. ylbtech-Unitity-CS:Hello world

    ylbtech-Unitity-CS:Hello world 1.A,效果图返回顶部   1.B,源代码返回顶部 1.B.1,Hello1.cs public class Hello1 { publi ...

  2. Undefined symbols for architecture x86_64 解决之道

    目前临时的解决办法是 1.把1.选中Targets—>Build Settings—>Architectures. 把build active architectures only 改为 ...

  3. Python补充01 序列的方法

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在快速教程中,我们了解了最基本的序列(sequence).回忆一下,序列包含有定值 ...

  4. Python深入03 对象的属性

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python一切皆对象(object),每个对象都可能有多个属性(attribut ...

  5. 安装ipython import path error

    sudo pip install ipython --upgrade # 升级 版本兼容性问题,升级到最新版本的ipython 后,会报错 from pickleshare import Pickle ...

  6. python 最长公共子序列

    网上有很多,但有bug,特别是这个:http://www.oschina.net/code/snippet_16840_2015 好大的坑... get length def lcs_len(a,b) ...

  7. c#内置颜色大全

  8. IIS6.0中布署MVC站点(转)

    昨晚我写的API上线,API是vs2010 + MVC4开发的,需要布署到windows 2003 server + IIS6.0的环境中,之前一直是布在IIS7.0,比较熟悉, 换到IIS6.0,添 ...

  9. 在每次request请求时变化session

    session.invalidate();//使得当前的session失效 request.getSession(true).getId();//生成一个新的session 原理: request.g ...

  10. PS 查看选定图层的高宽

    1.    选中图层,然后按键盘"Ctrl+T(菜单中点编辑->自由变换)",然后上面工具条会出现调整比率,宽W:100% H:100%,然后在100%的位置点鼠标右键,选择 ...