WPF中的依赖项属性(转)
出处:https://www.cnblogs.com/axzxs2001/archive/2010/04/25/1719857.html
随着WPF的推广,不得不重新拾起WPF来,因为这块的产品越来越多。
只能跟着MSDN来学了,所以想是在这里记录下学习的过程和对知识的理解。
先从最基本的吧,依赖项属性是WPF中不同的地方,先了解一下它吧。
“依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值”,这是官方的一句话,理解起来有点费劲。属性本身其实很简单,就是用来封装了字段的,本质上是两个访问器,来达到对字段值的读与写,以及从业务角度保护字段的业务有效性(因为大部分字段都有一定的业务含义,即有业务含义,就有一定范围,比如工资,是个小数的类型,但工资不可能是负数,所以在封装工资字段时,要在set访问器中作限制)。但依赖项属性不只这么简单了,属性的值不是简单的封装字段,而是根据其他的输入值来决定本属性的值。为什么要这样做?因为在WPF体系中,只有定义属性为依赖项属性,这个属性才支持样式设置,数据绑定,继承,动画和默认值。也就是这个属性才能具有WPF中的一些特点。
怎么样才能使一个属性成为依赖项属性呢?
首先,属性所在的类要直接或间接继承DependencyObject。这个类生成的对象表示一个具有依赖项属性的对象,这些对象,都能享用WPF的属性系统(属性系统主要是计算属性的值,并提供有关值已更改的系统通知)方面的服务。
这个类有两个比较重要的方法,GetValue(返回当前对象依赖项属性的当前有效值)和SetValue(设置依赖项属性的本地值)。
其实,属性对应的字段必需是公有,静态,只读的,类型为DependencyProperty。即public static readonly DependencyProperty 字段名,同时字段的命名也有规范,属性名+Property,字段在定义时,通过DependencyProperty.Register来实注册属性(只有注册了,才能使用WPF属性系统的服务)。
Register方法有三种重载,如下:
|
名称 |
说明 |
|
Register(String, Type, Type) |
使用指定的属性名称、属性类型和属性所在对象的类型。 |
|
Register(String, Type, Type, PropertyMetadata) |
使用指定的属性名称、属性类型、属性所在对象的类型和属性元数据注册依赖项属性。 |
|
Register(String, Type, Type, PropertyMetadata, ValidateValueCallback) |
使用指定的属性名称、属性类型、属性所在对象的类型、属性元数据和属性的值验证回调来注册依赖项属性。 |
在Register中,各个参数解释如下:
String:依赖属性的名字(不加Property,即字段的名字);
Type:属性的类型;
Type:属性所属对象的类型;
PropertyMetadata:依赖项对象的属性元数据,是一个PropertyMetadata类型,可能赋初始值。PropertyMetadata有一个object的构造函数;
ValidateValueCallback:表示用作回调的方法,这个类型是一个委托,用于验证依赖项属性的值的有效性,因为是委托,故它的构造参数为一个方法名。
最后,来构造依赖属性,与普通的属性有所区别:
Public 属性类型 属性名
{
Get
{
return (属性类型)this.GetValue(字段名);
}
Set
{
this.SetValue(字段名, value);
}
}
其中的GetValue和SetValue都是调用父类DependencyObject的方法。
完整的代码如下:
代码 1 class MyClass : DependencyObject
2 {
3 public static readonly DependencyProperty MyfieldProperty = DependencyProperty.Register("Myfield", typeof(int), typeof(MyClass), new PropertyMetadata(0), new ValidateValueCallback(new MyClass().MyValidateMethod));
4 public int Myfield
5 {
6 get { return (int)GetValue(MyfieldProperty); }
7 set { SetValue(MyfieldProperty, value); }
8 }
9 public bool MyValidateMethod(object value)
10 {
11 return true;//这里实现验证
12 }
13 }
14
WPF中,大部分对象的属性都是依赖项属性,用Button来举例,Button类的继承关系如下:

可以很明显的看到,Button是间接继承DependencyObject的。再看看他的属性:

拿ISDefault属性来看,它有一个IsDefalutProperty的字段,类型为DependencyProperty,IsDefault的代码如下:

完全与我们定义的依赖项属性一样。因为只有这样,这些属性才能使用WPF属性系统服务。
WPF中的依赖项属性(转)的更多相关文章
- WPF中的依赖项属性
Form cnblogs 桂素伟 随着WPF的推广,不得不重新拾起WPF来,因为这块的产品越来越多. 只能跟着MSDN来学了,所以想是在这里记录下学习的过程和对知识的理解. 先从最基本的吧,依赖项属性 ...
- 学习WPF——初识依赖项属性
入门 首先创建一个依赖项属性 然后绑定父容器的DataContext到这个依赖项的实例 接着绑定子元素的属性到依赖项属性(注意Button的Content属性) 程序最终的运行结果: 说明 首先是 ...
- WPF学习系列之二 (依赖项属性)
依赖属性;(dependency property) 它是专门针对WPF创建的,但是WPF库中的依赖项属性都使用普通的.NET属性过程进行了包装.从而可能通过常规的方式使用它们,即使使用他们的代码不 ...
- WPF教程五:附加依赖项属性
附加依赖项属性是一个属性本来不属于对象自己,但是某些特定场景其他的对象要使用该对象在这种场景下的值.这个值只在这个场景下使用.基于这个需求设计出来的属性.这里主要涉及到一个解耦问题.最大的优势是在特定 ...
- 在 WPF 中获取一个依赖对象的所有依赖项属性
原文:在 WPF 中获取一个依赖对象的所有依赖项属性 本文介绍如何在 WPF 中获取一个依赖对象的所有依赖项属性. 本文内容 通过 WPF 标记获取 通过设计器专用方法获取 通过 WPF 标记获取 p ...
- 如何在 WPF 中获取所有已经显式赋过值的依赖项属性
原文:如何在 WPF 中获取所有已经显式赋过值的依赖项属性 获取 WPF 的依赖项属性的值时,会依照优先级去各个级别获取.这样,无论你什么时候去获取依赖项属性,都至少是有一个有效值的.有什么方法可以获 ...
- [转]WPF 依赖项属性
from:http://blog.csdn.net/datoumimi/article/details/8033682 ps:环境限制,发的东西一长就会被拦截,所以删了一部分 UI软件中经常会用到大量 ...
- 迟到的 WPF 学习 —— 依赖项属性
本章学习依赖项属性,英文原文 Dependency Property,它是传统 .Net Framework 属性的扩展,是 WPF 的专属,但所幸使用起来和传统属性几乎一样.WPF 元素所提供的大多 ...
- 浅谈WPF依赖项属性
浅谈WPF依赖项属性 0. 引言 依赖项属性虽然在使用上和CLR属性一样,但是它是WPF特有的,不同于CLR属性.只是封装为我们常用CLR的属性,在语法使用上和CLR属性一样.WPF中一些功能:动画, ...
随机推荐
- 模板】AC自动机(简单版)
模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P3808 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保 ...
- 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance
浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...
- eclipse启动出现Could not read metadata for ……
Could not read metadata for …… E:\workspace\.metadata\.plugins\org.eclipse.core.resources\.projects\ ...
- 国内淘宝镜像 cnpm转npm
npm install -g cnpm --registry=http://registry.npm.taobao.org
- Aspose.Words二 基础
1.目录样式 doc.Styles[Aspose.Words.StyleIdentifier.Toc1].Font.Size = 14; doc.Styles[Aspose.Words.StyleId ...
- js计算日期增加
<div class="time"> <i class="visa_icon prev"></i><span id=& ...
- django ORM 增删改查 模糊查询 字段类型 及参数等
ORM 相关 #sql中的表 #创建表: CREATE TABLE employee( id INT PRIMARY KEY auto_increment , name VARCHAR (), gen ...
- django os.environ慎用setdefault操作环境变量!
在绝大多数情况下,如果需要在程序运行过程中设置环境变量,使用os.environ.setdefault函数是没有任何问题的,但是有两种场景下setdefault会造成意外的问题,需要慎用: 如果程序执 ...
- (转)Eclipse中需要查看某个类的源码,直接按住Ctrl 然后点击想要查看的类或则方法
文章转自:http://blog.sina.com.cn/s/blog_52f623240102vpcr.html 在Eclipse中需要查看某个类的源码,直接按住Ctrl 然后点击想要查看的 ...
- java 字符串截取类 区分中文、英文、数字、标点符号
package com.founder.fix.ims; /** * @author WANGYUTAO * 操作字符串 */ public class SubString { // public s ...