《深入浅出WPF》学习笔记之深入浅出话属性

依赖属性是一种可以从父级元素继承,并且可以通过Binding从数据源获取,当从父级继承时不占用内存的属性系统。拥有依赖属性的对象称为依赖对象。WPF允许在创建对象时并不分配用于存储数据的空间,而在需要时实时分配空间或直接借用父级数据,这种对象称为依赖对象(DependencyObject),这种实时获取数据的能力依靠依赖属性(Dependency Property)来实现。必须使用依赖对象作为依赖属性的宿主。DependencyObject是相当底层的一个基类,通过GetValue和SetValue获取或设置依赖属性的值。

声明和使用依赖属性

    public class Student:DependencyObject{public readonly static DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(String), typeof(Student));public String Name{get { return (String)GetValue(Student.NameProperty); }set { SetValue(Student.NameProperty, value); }}}

依赖属性一定被声明为public static readonly,并且约定依赖属性成员名称添加后缀“Property”表明这是一个依赖属性。依赖属性实例通过Register方法创建,Register的第一个参数为此依赖属性的CLR属性包装器的名称,第二个参数为依赖属性注册的类型,第三个参数为依赖属性的宿主类型。当依赖属性没有用CLR属性包装时,只能作为数据绑定的Target,使用CLR属性包装后,即可以作为Binding的Target,也可以作为Binding的Source。当依赖属性作为Binding的Source时,即使不实现INotifyPropertyChanged接口在属性值更改时也能通知Binding更改Target,依赖属性自带通知功能,因此当我们不想实现繁琐的INotifyPropertyChanged接口时可以使用依赖属性作为数据源。在Visual Studio中通过输入propdp在连按两次Tab键可以直接输入依赖属性模板,以加快编码速度。

依赖属性值存取的原理

创建一个DependencyProperty实例,并用它的CLR属性名和宿主类型名生成hash code,最后使用hash code作为DependencyProperty实例的key存入全局的名为DependencyProperty.PropertyFromName的Hashtable中。这样通过CLR属性名和宿主类型名检索出DependencyProperty实例,因此在同一个类型中不能声明CLR属性名相同的多个依赖属性实例。

依赖属性的值被统一存储在DependencyObject中的EffectiveValueEntry[] _effectiveValues这样的数组中,数组根据算法和DependencyProperty的GlobalIndex属性进行排序,依赖属性值的存取、删除、等操作都是针对这个数组进行,DependencyProperty的实例只是依赖属性值的标识,用来检索属性值。

附加属性

顾名思义,附加属性是说一个属性本来不属于某个类,但由于某种需求而被后来附加上。也就是说把对象放到一个特殊的环境中对象才有的属性。附加属性的作用就是让属性与数据类型解耦,让数据类型的设计更加灵活,附加属性定义在更高层次语义的对象上,在需要时附加到与之关联的对象上。附加属性本质上是依赖属性,二者仅在注册与包装器上有区别。

    public class School:DependencyObject{public static int GetGrade(DependencyObject obj){return (int)obj.GetValue(GradeProperty);}public static void SetGrade(DependencyObject obj, int value){obj.SetValue(GradeProperty, value);}// Using a DependencyProperty as the backing store for Grade.  This enables animation, styling, binding, etc...public static readonly DependencyProperty GradeProperty =DependencyProperty.RegisterAttached("Grade", typeof(int), typeof(School), new PropertyMetadata(0));}

声明附加属性时仅注册方法不同,参数和参数含义相同。附加属性的包装器与依赖属性不同,分别声明Get和Set方法用来存取附加属性,附加属性存取在要附加的对象上。实际上附加属性就是使用定义在其他类中的DependencyProperty存取属性值。附加属性的本质为依赖属性,因此可以使用Binding依赖其他对象的属性值。示例代码:

        <Slider x:Name="slider" Minimum="0" Maximum="100"></Slider><Canvas Width="200" Height="200" Background="Gray"><Rectangle x:Name="rect" Width="20" Height="20" Canvas.Left="{Binding ElementName=slider, Path=Value,Mode=OneWay}" Fill="Red"></Rectangle></Canvas>//等价的后台代码Binding binding = new Binding("Value");binding.ElementName = "slider";binding.Mode = BindingMode.OneWay;rect.SetBinding(Canvas.LeftProperty, binding);

 

转载于:https://www.cnblogs.com/jefflee/p/5822470.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql 创建表时AUTO_INCREMENT=10

默认地&#xff0c;主键的开始值是 1&#xff0c;每条新记录递增 1&#xff0c;AUTO_INCREMENT10 代表初始值为10。

一年代码功能点的创新性怎么写_查新报告的查新点(创新点)写法,参考

创新点(查新点)写法参考(要求&#xff1a;尽量具体&#xff0c;简明扼要&#xff0c;突出核心亮点&#xff0c;用专业术语。不要写的笼统、抽象、宽泛、上位)。可从结构、技术、参数、功能等方面考虑(并非全部要写)&#xff1a;1、结构方面的创新(前面部分是具体的创新结构形式…

查询手机号段对应地区编码_2020陕西专升本考试今日起查询成绩啦

专升本考试顺利结束,我们终于迎来了验收成果的时刻,每位参与专升本的同学都是最棒的,现在 我们一起去揭秘考试成绩吧&#xff01;专升本成绩查询指南成绩查询及志愿填报登陆“陕西省教育考试院”或“陕西省招生考试信息网”陕西招生考试信息网http://www.sneac.com/陕西省教育…

李德仁院士:5G时代空间信息如何实现智能服务

李德仁院士来源&#xff1a;光明日报【编者按】随着5G时代的到来&#xff0c;物联网、云计算、大数据等技术快速发展。信息基础设施日益完善&#xff0c;全球时空大数据呈爆发式增长。在这样的时代背景下&#xff0c;如何实现空间感知和空间认知的智能化&#xff0c;在正确的时…

个人对响应式布局的理解

从字面上理解&#xff0c;响应式布局即CSS布局随着屏幕尺寸的变换而变化。首先我们要搞清楚什么是固定布局&#xff0c;什么是流式布局。固定布局(Fixed Layout)使用固定宽度的包裹(Wrapper), 内部的各个部分可以使用百分比或者固定的宽度来表示. 这里最重要的是, 外面的所谓包…

jmeter 不同场景 比例_在JMeter测试中如何根据业务场景来控制运行比例

性能测试混合场景中&#xff0c;我们需要组合多个业务操作到场景中来。比如有一个论坛的业务分布如下&#xff1a;开新帖与回复帖子的比例为2:3&#xff0c;那么我们在JMeter测试计划中如何控制其比例呢&#xff1f;下面我们介绍两种方式&#xff1a;1.多线程组方式2.逻辑控制器…

python爬取新浪新闻首页_学习了《python网络爬虫实战》第一个爬虫,爬取新浪新闻...

请安装anaconda,其中附带的spyder方便运行完查看变量 1.进入cmd控制台&#xff0c; 输入 pip install BeautifulSoup4 pip install requests 2.编写代码&#xff0c;代码已经很清晰了&#xff0c;直接运行不会报错并有成功的结果def getNewsDetail(newsUrl): import requests f…

sql去重查询

例如&#xff0c;从 "Websites" 表的 "country" 列中选取唯一不同的值 SELECT DISTINCT country FROM Websites;

计算机和人类“看”法不同,但这重要么?

来源&#xff1a;大数据文摘“看”这个动作一直被认为是生物所独有的。当工程师第一次“教”计算机“看”这个动作时&#xff0c;他们理所当然地认为计算机可以像人类眼睛一样进行观看。约克大学&#xff08;York University&#xff09;计算机科学家约翰托索斯&#xff08;Joh…

获取项目根路径,并在其下创建一个名称为userData 的目录。

NSArray *pathsNSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentsDirectory [paths objectAtIndex:0]; // 创建文件系统管理器 NSFileManager *fileManager [[NSFileManageralloc] init]; // 判断userData 目录是否存在 …

svn拉取文件合并_SVN的分支使用

使用过git版本管理的同学大部分都使用过分支&#xff0c;git创建切换分支非常直观&#xff0c;SVN则相对来说没有那么强的分支的概念。本文主要介绍SVN中的分支使用。SVN默认的生成目录如下通常 branches 目录下为开发分支&#xff0c;tags 目录为标签目录&#xff0c;trunk 为…

python编程入门单例_python实现单例模式怎么写啊?

这个网上有很多的&#xff0c;你可以搜一搜&#xff0c;单例设计模式很多面试官都会考的&#xff0c;最好是记住一两个&#xff0c;我下面写一个例子给你看一下 使用__new__方法 在__new__方法中把类实例绑定到类变量_instance上&#xff0c;如果cls._instance为None表示该类还…

超级智能的定义,一个已经诞生并不断深刻影响人类的新智能

来源&#xff1a;今日头条在人工智能领域&#xff0c;有一个不成熟的观点&#xff0c;认为当人工智能发展成为“在几乎所有领域都大大超过人类认知表现的任何智力”时&#xff0c;这时人工智能可以被视作超级人工智能或超级智能。但这种从人工智能延伸的超级智能因为在理论和实…

MySQL修改数据表存储引擎的3种方法介绍

看你的mysql现在已提供什么存储引擎:mysql> show engines;看你的mysql当前默认的存储引擎:mysql> show variables like %storage_engine%;你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):mysql> show create table 表名; MySQL作…

linux suse 共享目录_SUSE环境下YAST源(连接共享目录)

很多台SUSE11版本的服务器都需要安装net-snmp包&#xff0c;我不想一个劲地插拔光盘&#xff0c;于是想办法写了这篇短文背景说明&#xff1a;实际情况是&#xff0c;有很多台suse11版本的服务器都需要安装net-snmp包&#xff0c;suse下的Yast服务可以解决包之间的依赖关系问题…

2019年人工智能行业现状与发展趋势报告

来源&#xff1a;前瞻产业研究院未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网…

python自动化运维书籍推荐_《Python 自动化运维:技术与最佳实践》

第一部分 基础篇 第1章 系统基础信息模块详解 2 1.1 系统性能信息模块psutil 2 1.1.1 获取系统性能信息 3 1.1.2 系统进程管理方法 6 1.2 实用的IP地址处理模块IPy 7 1.2.1 IP地址、网段的基本处理 8 1.2.2 多网络计算方法详解 9 1.3 DNS处理模块dnspython 11 1.3.1 模块域名解…

memcache中的add和set方法区别

相信大家对memcache都不陌生&#xff0c;在项目中也经常使用memcache作为缓存方案&#xff0c;那么在使用过程中有没有发现为什么memcahce有两个添加缓 存的方法&#xff1a;一个是add&#xff0c;一个是set&#xff0c;那么你知道这2个方法有什么不同吗&#xff1f;什么时候该…

npm 全局安装vuecli报错_前端脚手架CLI生成模版命令工具(包括,npm包的发布,脚手架的搭建,注意事项,优化等)...

NodeJs的出现&#xff0c;让前端工程化的理念不断深入&#xff0c;正在向正规军靠近。先是带来了Gulp、Webpack等强大的构建工具&#xff0c;随后又出现了vue-cli和create-react-app等完善的脚手架&#xff0c;提供了完整的项目架构&#xff0c;让我们可以更多的关注业务&#…