在WPF中,依赖属性附加和普通附加和附加属性附加和普通附加之间有什么区别

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

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

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

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

  我们都知道.NET中有属性附加和普通附加(Property)这个概念在MSDN中是这样定义属性附加和普通附加的:

    属性附加和普通附加是这样的成员:它们提供灵活的机制来读取、编写或计算私有字段的值。可以像使用公共数据成员一样使用属性附加和普通附加但实际上它们是称为“访问器”的特殊方法。这使得数据在可被轻松访问的同时仍能提供方法的安全性和灵活性。

  正如MSDN所说.NET属性附加和普通附加其实是由一对get,set方法实现的。为什麼会有这样的设计呢原因在于很大程度上这样的实现更有利于安全。试想若是简单的写几个public的字段,很容易被写入非法的值而属性附加和普通附加就可以在赋值之前检查给定值的合法性。而且这也体现了OOP的三大原则之一:封装。套用一句歌词:字段不是你想改就能妀

         虽然属性附加和普通附加有万般好处,可是世上没有绝对的完美上面说了,属性附加和普通附加是包装了一个字段的而我们知道,非静态的字段是由类的各个实例自己持有的虽说个把字段不打紧,可是一旦实例多起来这笔开销也是很可观的:不仅程序变得很慢還很耗费资源。

   那该怎么办呢方法总比问题多,这可难不倒我们聪明的程序员^_^

         既然各个实例自己存储实例,那换过来:能否从借用别人的呢哈哈,聪明的你一定也想到了诚然,在WPF中也是这么做的

         在WPF中,微软为克服上面所说属性附加和普通附加的缺陷改进叻实现:允许对象借用其他对象的属性附加和普通附加。这样的对象就叫做依赖对象而实时获取数据的功能则是通过依赖属性附加和普通附加来实现的。下面我们来看一下简单的依赖属性附加和普通附加使用。     

         首先我们需要依赖属性附加和普通附加的载体——依赖对象在WPF已经为我们提供了这么一个类,我们可以通过继承它来构建自己的依赖对象,如下所示:

   Cool神曲就是神曲,我的博客要是有這么多点击率就好了^_^

         相信大家已经对依赖属性附加和普通附加和附加属性附加和普通附加已经有了大概的了解了如果没有,不要气馁那是我的问题,毕竟我是信息源我的表述有问题。

   《深入浅出WPF》下载:

我要回帖

更多关于 属性附加和普通附加 的文章

 

随机推荐