前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励。现在开始继续做WPF2000系列。

  在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师。最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,000 Things You Should Know About WPF 。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。Follow他的博客也有一段日子了,很希望能够分享给大家。

  本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。

  在这里郑重说明.该系列是基于Sean Sexton先生的英文博客, Sean Sexton拥有全部版权和撤销权利。

  前文:<1-7>, <8-14>,<15-21>22-27>, <28-33>,<34-39>,<40-44>,<45-50>

  [小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂cnblogs.com/xfuture]


  #51 依赖属性的实现

  WPF客户端使用依赖属性的方式如同一般的CLR属性,但在类的定义中实现方式有差异。依赖属性增加了对数据绑定,属性集成和变更通知等等复杂的机制。 Class通过继承Denpendency Object来支持对Denpendency Properties的读写。

  Class声明类型为DependencyProperty的新属性的静态变量。使用DependencyProperty.Register方法来创建静态实例。这个实例并不存储任何属性,只存储该属性的元数据。

  

public static readonly DependencyProperty AgeProperty =
DependencyProperty.Register("Age", typeof(int), typeof(Person));

  在继承了Denpendency Object的类中通过属性的 GetValue and SetValue方法来读写该依赖属性。

public int Age
{
get { return (int)GetValue(AgeProperty); }
set { SetValue(AgeProperty, value); }
}

 

  #52 依赖属性的实现

  标准的CLR属性值是存储在定义它的类的实例中。即使你从更改过它的默认值,它仍会占据这个对象相应的内存。

  而依赖属性当且仅当它赋予非默认值时才会被存储。如若你未设置该属性的默认值,客户端读取时则会返回该属性的默认值。

  依赖属性的值被拥有它并且继承了DependencyObject的类存储在一个数组中。这个储存了依赖属性值得数组,以及GetValue和SetValue方法来读写依赖属性值的特点,是继承自DependencyObject类的特点。这个内部的数组会存储每个设置过了非默认值的依赖属性值。

  #53 注册依赖属性

  实现依赖属性,首先要创建一个DependencyProperty的静态实例,因为其作用是为了读写元属性值,而并不是存储其实际属性值。所以其为静态的。

  步骤:1. 声明一个静态的DependencyProperty实例:

public static readonly DependencyProperty AgeProperty;

  2. 在静态的构造函数里,使用DependencyProperty.Register

static Person()
{
PropertyMetadata ageMetadata =
new PropertyMetadata(
, // Default value
new PropertyChangedCallback(OnAgeChanged),
new CoerceValueCallback(OnAgeCoerceValue)); // Register the property
AgeProperty =
DependencyProperty.Register(
"Age", // Property's name
typeof(int), // Property's type
typeof(Person), // Defining class' type
ageMetadata, // Defines default value & callbacks (optional)
new ValidateValueCallback(OnAgeValidateValue)); // validation (optional)
}

  注册的前三个参数是必须的。

  你也可以指定:1. 属性默认值。2.属性值改变时的通知方法。3. 验证值合法性。

  #54 不要在DependencyProperty的Getter/Setter方法里加入逻辑

  要实现依赖属性,需要使用 DependencyObject.GetValue and DependencyObject.SetValue 方法来实现Getter/Setter. 这样就实现了依赖属性正常的CLR属性功能。 

public int Age
{
get { return (int)GetValue(AgeProperty); }
set { SetValue(AgeProperty, value); }
}

  你不应该在get和set中使用除了getvalue和setvalue以外的方法。因为在xaml中获取或者赋值的时候,wpf会直接调用getvalue和setvalue方法,绕过你在里面写的逻辑。你应该在获取或者设置的回调方法里来写入你的逻辑。

  

  

  #55 在Xaml或者cs代码里读取/写入依赖属性值

  在Xaml或者cs代码里都可以读取/写入依赖属性的值。

  例如在Person类里我们实现了三个依赖属性, FirstName, LastName, Age. 在Xaml中可以这样使用:

<m:Person x:Key="guy" FirstName="Samuel" LastName="Clemens"  Age=""/>

  代码中可以这样:

Person author = (Person)this.Resources["guy"];
string info = string.Format("{0} {1}, aged {2}", author.FirstName, author.LastName, author.Age);

  

  

  #56 清除依赖属性

  在Xaml或者cs代码里都可以通过写入依赖属性的值来对默认或者继承的依赖属性值进行覆盖。

  也可以使用DependencyObject.ClearValue方法来清除该依赖属性值。这将会取消掉任何设置在该依赖属性的值,恢复其为默认值。

Person p = new Person("Samuel", "Clemens");
Console.WriteLine(p.Age); // 18 (the default) // Setting a property value
p.Age = ;
Console.WriteLine(p.Age); // 70 // Clear a property value
p.ClearValue(Person.AgeProperty);
Console.WriteLine(p.Age); // 18 again

  

   下期会对依赖属性进行进一步的解析,希望大家可以继续支持~

  PS. 昨晚下班后和同事一起做了WP的一个应用 疯狂猜词,本意是为了我们自己玩耍,后来就上线分享给大家,希望大家可以支持。初版本视觉略微贫瘠,缺少美工。之后我们会寻找美工神马的,也会继续迭代开发更新版本。

  

  希望大家可以多多关注和建议,好评就更好啦~

2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>的更多相关文章

  1. 2000条你应知的WPF小姿势 基础篇<15-21>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  2. 2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  3. 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  4. 2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  5. 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  6. 2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  7. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  8. 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  9. 2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

随机推荐

  1. AutoFac在项目中的应用

    技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...

  2. .Net 分布式云平台基础服务建设说明概要

    1)  背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2)  基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3)  概要说明 基础服务的发展会根 ...

  3. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  4. Spark读写Hbase的二种方式对比

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...

  5. 代码的坏味道(17)——夸夸其谈未来性(Speculative Generality)

    坏味道--夸夸其谈未来性(Speculative Generality) 特征 存在未被使用的类.函数.字段或参数. 问题原因 有时,代码仅仅为了支持未来的特性而产生,然而却一直未实现.结果,代码变得 ...

  6. hibernate的基本xml文件配置

    需要导入基本的包hibernate下的bin下的required和同bin下optional里的c3p0包下的所有jar文件,当然要导入mysql的驱动包了.下面需要注意的是hibernate的版本就 ...

  7. 免费公开课,讲解强大的文档集成组件Aspose,现在可报名

    课程①:Aspose.Total公开课内容:讲解全能型文档管理工具Aspose.Total主要功能及应用领域时间:2016-11-24 14:30 (暂定)报名地址:http://training.e ...

  8. Redis配置文件redis.conf

    1.地址 2.Units单位 1 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 2 对大小写不敏感 3.includes包含

  9. Web应用之LAMP源码环境部署

    一.LAMP环境的介绍 1.LAMP环境的重要性 思索许久,最终还是决定写一篇详细的LAMP的源码编译安装的实验文档,一来是为了给自己一个交代,把技术进行系统的归纳,将技术以极致的形式呈现出来,做为一 ...

  10. ReactNative入门 —— 动画篇(下)

    在上篇动画入门文章中我们了解了在 React Native 中简单的动画的实现方式,本篇将作为上篇的延续,介绍如何使用 Animated 实现一些比较复杂的动画. 动画组合 在 Animated 中提 ...