WPF里的DependencyProperty(1)

C#依赖属性深度解析:WPF开发的核心机制 / 1. 注册依赖属性"Text", // 属性名称typeof(string), // 属性类型typeof(CustomControl), // 所有者类型"Default Text", // 默认值// 值变更回调// 2. 包装器属性// 3. 值变更处理逻辑control?关键参数说明:控制绑定方向、继承行为等变更回调可实现数据验证、UI更新等扩展逻辑// 在UserControl中暴露可绑定属性允许第三方通过属性设置定制控件行为。实现声明式编程模型。 阅读详情
自己一个人学东西,怎么样才算会了?除了做东西,有两个检验的办法,第一是去给不懂的人讲,看看能不能把别人讲明白了,第二是写文章,看看理不理的清楚思路 呵呵
第一次尝试写些东西,,先在这儿贴出来再说~
不废话了,今天先发第一部份


 
一 引入DependencyProperty

这个概念可以说是WPF核心中的核心了。在WPF的框架中随时都能见到它的身影。关于DependencyProperty能带来的诸多方便,很多介绍性的文章里都有,我这里就不介绍了,今天先从什么是DependencyProperty说起。


从属性开始属性

在CLR中有属性(Property)这个概念,它可以用来封装字段。

private   string  _myString;
public   string  MyString
{
         
get{return _myString;}
        
set{_myString=value;}
}

 这种属性应用的非常多,我们还可以在set或get方法中加入某些逻辑,确定读取或者设置属性的值的时候我们是不是需要某些其他的判断,一个经典的例子是在Age属性的set方法中加入对年龄范围的判断。这些就不多说了。

但是WPF框架的编程经常和界面打交道,经常遇到的一个情况是某个属性的值的变化会影响到多个其他对象。比如当一个Button的改变大小超过了它的容器,他的容器应该自动调整大小。于是我们考虑在每个属性的set方法中触发一些事件,但很快我们发现现有的功能很难满足我们的需求,至少不能简洁漂亮的满足这些需求。
实际上我们的需求更加复杂,WPF中的数据绑定,XAML语法等很多地方都和属性密切相关,我们迫切需要一种功能更加强大的属性。

 于是在WPF中,引入了一种特殊的属性,Dependency Property。这种属性和普通的属性最大不同在于,它的值的来源并不单一。对这种属性的取值和赋值都会能与其他对象有影响,因此能得到很大的灵活性。

这很抽象,也许很难懂。不明白不要紧,先接着看。一步步来,先看看DependencyProperty长什么样,从定义DependencyProperty开始:

public   static   readonly  DependencyProperty MyStringProperty  =  DependencyProperty.Register(
            
" MyString " ,
            
typeof ( string ),
            
typeof (ClassMyDependency),
            
new  PropertyMetadata( " defaultValue " new  PropertyChangedCallback(onMyStringPropertyChange)));

一眼看上去很复杂,首先使用public static readonly的方式(其实就是设计模式里的单键 这是.net里的一种简单实现)定义了一个全局的DenpendencyProperty成员,这个成员的值通过DependencyProperty的Register方法获得,这个成员我们称做DependencyProperty标识。

我们传入了一些参数,分别表示属性名,属性类型,父元素(也就是包含属性的元素)类型,属性元数据(这些以后再详细介绍)。
要注意的是, 虽然我们定义的名称是MyStringProperty,但是属性的名称不是成员的名称,它由第一个参数指定.这个Property的后缀不是可选的,虽说不按照这个规则编译能通过,但是.net中很多地方都遵循了这种规则,这里我们了解这个规则并保证自己定义的DependecyProperty都遵循它就行了,以后会有更详细的解释.

实际上我们得到了一个属性的标识,这个数据是全局的且是唯一确定的,当需要访问属性的值时,只需要调用对象的GetValue()和SetValue()方法来访问()。语法是:

GetValue(property)
SetValue(property, value)

方法的调用者,不仅可以是定义DependencyProperty的对象,它可以是任何继承了DependencyObject的对象,换句话说,这个属性定义在了这里,但是它并不完全属于这个对象。这很不好理解,不过也正是DependencyProperty功能的强大之处之一,现在先不必深究这个。 
 
不过使用GetValue和SetValue方法给属性赋值让我们很不习惯,于是我们可以对这两个方法进行封装,在上面DependencyProperty的定义之后加上:

         public   string  MyString
        
{
            
get return (string)GetValue(myStringProperty); }
            
set { SetValue(myStringProperty, value); }
        }

这在 MSDN 中称为 ”CLR 封装 (wrapper)” ,这是可选的,不过经过封装之后,这样对于外界来说, DependencyProperty 就和传统属性没有什么区别了,实现了完全的“向下兼容”。 

  虽然我们还不很清楚DependencyProperty到底可以用来做什么,但现在为止至少已经实现了传统属性的所有功能,注意到,我们并没有定义那个private的私有字段。实际上,.net自动为我们创建了用来存储属性值的区域,这是一种基于Hash的数据存储机制,效率肯定低于传统属性,不过这些效率损失不足以影响我们。插一句,牺牲一点点性能来换取强大的功能是DotNet的一贯做法,呵呵

 关于为DependencyProperty的赋值,实际上和传统的属性没有太大区别,XAML和 code中都可以为其赋值:
code中就不介绍了,和传统属性赋值相同,在XAML中,使用一个XML属性即可:
<l:ClassMyDependency MyString="11111" MyString1="22222" x:Key="myclass" />

l是实现定义的名字空间前缀,MyString是一个DependencyProperty,MyString1是一个普通属性,实际上这两个属性都能实现XAML下的赋值。
这一句XAML如果翻译成C# code大概是这个样子:

        ClassMyDependency myclass  =   new  ClassMyDependency();
        myclass.MyString
= " 11111 " ;
        mycalss.MyString1
= " 22222 " ;

网上有一些地方介绍说DependencyProperty主要功能是为了能让XAML代码为后台属性赋值,这是错误的。
不过使用XAML使用DependencyProperty也是有道理的。至于具体为什么,我准备在后续的POST里面会详细的说明。

 

好了,就这么多。今天的第一篇里,我们看到了DependencyProperty的样子,大概了解它的定义,它的存储方式。不过事实上我们到现在还并不知道这到底能用在什么地方。下一篇POST中我准备介绍一下DependencyProperty的一些用途,并且从用途出发看看一下它是如何完成这些看似有点不可思议的功能的。

C# WPF DependencyProperty程序 C# WPF DependencyProperty程序,方便程序的理解。https://mp.csdn.net/postedit/87916547 立即下载

相关推荐

C# WPF中的DependencyProperty介绍

  参考文章https://www.cnblogs.com/flypig/articles/2158833.html 这先介绍格式: public string MyString { get { return (string)GetValue(MyStringProperty); } set { SetValue(MyStr...

yanxiaoyunsana的博客 1万+

剖析依赖属性

剖析依赖属性 Dependency Property## 【了解属性和字段】 我们知道,属性是面向对象语言中用来封装字段的外衣,它像是字段对外界的桥梁,我们可以通过属性来验证数据的合法性或控制对外的访问性等等。每个属性的背后都有其对应的一个字段做支撑,就算是自动属性,在编译时系统也会创建其字段,只不过自动属性是微软给我们的语法糖罢了。在C#中,属性最后是会编译成两个方法:get_属性名和set_属性名(如果是只读属性,则没有set方法,反之没有get方法)。 编译成方法,属性就不会占用太多空间,因为方法存在

kalvin_y_liu的博客 1468

C#小知识(篇章二)UpDateing

C#小知识

qq_43590078的博客 720

WPFDependencyProperty(1)

 自己一个人学东西,怎么样才算会了?除了做东西,有两个检验的办法,第一是去给不懂的人讲,看看能不能把别人讲明白了,第二是写文章,看看理不理的清楚思路 呵呵第一次尝试写些东西,,先在这儿贴出来再说~不废话了,今天先发第一部份一 引入DependencyProperty 这个概念可以说是WPF核心中的核心了。在WPF的框架中随时都能见到它的身影。关于DependencyProperty能带来的

北京动点飞扬软件 1135

WPF 依赖属性 DependencyProperty

依赖属性 在WPF中使用了更高级的依赖项属性替换了.net中的属性。依赖属性具有一些更高效的保存机制,同进支持附加功能,如 更改通知(Change Notification)以及属性值继承(在元素树中向下传递默认属性值)。依赖属性同样还是WPF中Animation,Binding,Style的重要基础。

dearbigdog的博客 8601

WPFDependencyProperty(2)

WPFDependencyProperty(2) 废话照例,每篇开头都说些废话。一年前写了一篇.Net3.0DependencyProperty1),没下文了,很对不起大家。是啊,都是一年前的事情了。这一年中发生了很多事情……()……,最近终于又有空开始研究WPF了。一年过去,WPF发布了3.5版本,有了许多不大不小的改变,我准备接着去年的进度,继续研习下去,现在就先试着把去年

pnuts的专栏 526

wpf DependencyProperty? 方便查询用

WPF、Silverlight 和 UWP 等 XAML 平台的核心属性系统。它不是一个普通的 .NET 属性,而是一个在依赖对象中注册并由 WPF 属性系统管理的属性。你可以把它理解为对普通 CLR 属性的一个“增强版”。样式设置数据绑定动画动态资源引用属性值继承这是最常见的使用场景。当你创建一个新的或从Control类继承来制作自定义控件时,你需要使用来定义控件的属性,这样这些属性才能享受到 WPF 属性系统的所有高级功能。为一个自定义的“圆形按钮”控件添加一个属性。csharp复制。

zm_struggle的博客 894

WPF中DependencyObject与DependencyProperty的源码简单剖析

Windbg调试WPF的依赖属性中提到了wpf的DependencyObject中DependencyProperty是如何调试查看的。从中我们看出DO(DependencyObject)与 DP(DependencyProperty)一些内部实现。这篇文章我们就从源码入手, 让大家了解下依赖对象中依赖属性的值的获取和赋值。我们先看个DP注册的例子:public class MyStateCont

muzizongheng的专栏 5444

如何在wpf程序中使用DependencyProperty

作为例子,我决定定义一个MyBorderEx,在WPF常用的"Border"控件中创建一个名为Transparency的属性,来指示它的透明度,这个属性值在0-255间变化,255表示全透明,0表示完全不透明。 DependecyProperty提供了属性改变通知的功能,我们可以利用DependencyProperty的这个功能,定义一个transparencyPropertyChan...

anyong7941的博客 247

WPFDependencyProperty详解

1 DependencyProperty从属属性 1. 从属属性要定义为静态.为了在外部可以绑定,最好定义为Public 2. 从属属性实际上是取代了正常属性的存值变量 3. 如果从属属性所对应的正常属性是实例成员,操作属性值时的表现形式为实例成员 4. 只有继承System.Workflow.ComponentModel.DependencyO...

a410256649的博客 410

WPF学习笔记06-依赖属性DependencyProperty

依赖属性01

qq_23506909的博客 2864

介绍WPFDependencyProperty的一些基本用法

这一篇Post中,我准备先介绍WPFDependencyProperty的一些基本用法。      在程序中使用DependencyProperty好的,我相信你已经决定了要使用DependencyProperty而不是传统的CLR属性,正如上一篇Post所说,很多地方都需要使用到DependencyProperty,作为例子,我决定定义一个MyBorderEx,在WPF常用的"Border

albert的专栏 8868

WPF 依赖属性 DependencyProperty

前言: 在使用WPF的时候,总会有一个疑问,依赖属性跟普通的类属性有什么区别,微软要在WPF引入它想要解决什么问题?如果不解除这个疑惑,在编程的时候心总会不踏实。因此我在网上找了一些资料,终于弄懂了它的由来和机制,特意和大家分享,如有不足,请各位指正! 依赖属性的由来: 在WinForm时代,每个控件类(如TextBox)都会包含许多属性,但是真正用到的少之又少(如text),其他属性就会...

wzgbgz的博客 1268

WPFDependencyProperty(3)

  这一篇Post中,我准备先介绍WPFDependencyProperty的一些基本用法。在程序中使用DependencyProperty好的,我相信你已经决定了要使用DependencyProperty而不是传统的CLR属性,正如上一篇Post所说,很多地方都需要使用到DependencyProperty,作为例子,我决定定义一个MyBorderEx,在WPF常用的"Bord

wmjcom的专栏 1402

WPF--->DependencyProperty依赖属性、Attach附加属性

依赖属性就是一种可以自己没有值,并能通过使用Binding从数据源获得值(依赖在别人身上)的属性。拥有依赖属性的对象称为“依赖对象”。

qq_42069216的博客 1840
上一篇: WPF中的DoubleAnimation
下一篇: WPF里的DependencyProperty(2)
pnuts
博客等级 码龄19年 6粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值