如何理解WPF中的wpf 依赖属性项属性

WPF自学笔记之——依赖项属性
在.net中已经有了属性了,为什么WPF要加入依赖项属性呢,这个我很想知道的,,,后来我发现,在WPF中,有几个很重要的特征都是需要依赖项属性的支持,例如数据绑定,动画,样式设置等。
在使用依赖项属性的时候我都以为是在用.net中的属性,但是确实上不是的,在WPF中,绝大多数属性都是依赖项属性,只不过它是用了普通的.net属性过程进行了包装,通过这种包装,就可以像使用属性一样使用依赖项属性了,在后面会说一下怎么通过这种方式包装的。这就使用了旧技术来包装新技术的设计理念了。这使得不会扰乱.net领域中其他的部分。
在说依赖项属性的时候,首先先说一下属性吧。先创建一个Person类,里面有name属性。
public class Person
public string name{}
好了,这样的一个属性已经创建好了。属性的创建就是这么简单。在我们想要使用这个类的地方初始化,就能用了。
既然说WPF中绝大多数的属性都是依赖项属性,我看了一下Width属性的定义&
这个是TextBlock控件,但是它的Width为什么是FrameworkElement类的Width属性呢,我们继续进入看一下
这个Width属性是一个静态的只读DependencyProperty类型的,这就是这节笔记说讲的:依赖项属性。
在FrameworkElement类里面,不仅看到了Width属性,还看到了好多其他的依赖项属性的声明,如下图:
然后,就要说一下,在WPF中,怎么创建一个依赖项属性呢???
步骤是这样的
一:注册依赖项属性
public static DependencyProperty Register(&
string name,&
&Type propertyType,&
&Type ownerType,&
&PropertyMetadata typeMetadata
看一下依赖项属性注册的方法,这是其中一个构造函数,也是常用的。
第一个参数是string类型的,是属性名。
第二个参数是这个依赖项属性的类型。
第三个参数是这个拥有这个依赖项属性的类型。
第四个参数是具有附加属性设置的FramWorkPropertyMetadata对象。
好,尝试一下用这个方法进行注册依赖项属性
& & public class Student:DependencyObject
& & & & public static readonly DependencyProperty NameProperty = DependencyProperty.Register(
typeof(string),&
typeof(Student),
&new FrameworkPropertyMetadata(string.Empty));
好了,这样就注册好了依赖项属性了。
其中第四个参数是有很多中设置方式的,具体就具体查一下吧。
其实还有5个参数的重载构造函数,第五个参数就是ValidateValueCallBack()称之为回调函数。它用于对属性的检验。
二:添加属性包装器
这个时候就是用旧技术来包装新技术了。
用SetValue()和GetValue方法;
好了,包装完成,已经可以使用了。那么我们怎么使用呢?
新建一个对象,就好像使用普通属性一样使用就行了,因为这是依赖项属性,所以在绑定的时候会自动更新的,不用设置其他东西。
在WPF中,一些类会共享同一个依赖项属性,例如FontFamily这个依赖项属性,TextBlock.FontFamily Control.FontFamily,这两个类共享一个FontFamily依赖项属性,而这个FontFamily依赖项属性是在TextElement中注册的,而TextBlock和Control是通过DenpendencyProperty.AdOwner()方法重用该属性。
有一个特殊的依赖项属性,就是布局里面经常用到的Grid.Row等,这些是附加属性,它和依赖项属性有一点区别。
用一个例子说一下附加属性:一个学校里面有很多各班级,新生入学的时候是会被分到各个班中,那么这个学生就被赋予了一个属性,就是班级。被分到一班,那么这个学生的属性里面就附加了班别是一班了。
最后,分享一下我以前用自定义依赖项属性的一个例子吧,我在做注册页面的时候,有一个输入框是PasswordBox控件,这是用来装密码的,其中装密码的属性是Password这是一个普通的属性,所以不支持绑定的,那么我要做的是绑定两个&PasswordBox中Password到一个Table中,提示,如果输入密码和确认密码都正确的时候就提示输入正确,其他情况都不行。因为绑定是要依赖项属性才行,所以很无奈,,结果上网看了一个前辈的博客,就是自己定义一个依赖项属性,然后将&Password和这个依赖项属性进行同步,然后利用这个自定义的依赖项属性进行绑定,问题就解决了。
ps:谢谢阅读,请多多指教!!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。WPF企业级开发之深入剖析WPF依赖属性_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
WPF企业级开发之深入剖析WPF依赖属性
上传于||文档简介
&&依​赖​属​性​基​本​应​用​在​了​W​P​F​的​所​有​需​要​设​置​属​性​的​元​素​。​依​赖​属​性​根​据​多​个​提​供​对​象​来​决​定​它​的​值​(​可​以​是​动​画​、​父​类​元​素​、​绑​定​、​样​式​和​模​板​等​)​,​同​时​这​个​值​也​能​及​时​响​应​变​化​。​所​以​W​P​F​拥​有​了​依​赖​属​性​后​,​代​码​写​起​来​就​比​较​得​心​应​手​,​功​能​实​现​上​也​变​得​非​常​容​易​了​。​如​果​没​有​依​赖​属​性​,​我​们​将​不​得​不​编​写​大​量​的​代​码​。
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩3页未读,继续阅读
你可能喜欢WPF系列 —— 控件添加依赖属性 - 推酷
WPF系列 —— 控件添加依赖属性
依赖属性的概念,用途 ,如何新建与使用。本文用做一个自定义TimePicker控件来演示WPF的依赖属性的简单应用。
先上TimePicker的一个效果图。
概念 和 用途:依赖属性是对传统.net 属性的一种封装,使一个传统.net属性支持 WPF 中的 数据绑定、动画、样式 等功能。
新建:任意代码代码文件中 ,输入 propdp 再双击tab键。生成如下的代码块。
MyProperty: 依赖属性的名称; ownerclass: 当前依赖属性绑定的所有类; new PropertyMetadata 是依赖属性的初始化对象,这里0代表默认值。
public int MyProperty
get { return (int)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
// Using a DependencyProperty as the backing store for MyProperty.
This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register(&MyProperty&, typeof(int), typeof(ownerclass), new PropertyMetadata(0));
使用:这里我们使用绑定绑定,稍后使用自定义控件的Time属性来介绍。
如何使用依赖属性构建一个带绑定的TimePicker自定义控件
新建一个项目名称为DependencyPropertyDemo的WPF 项目
,新建一个TimePicker的自定义控件。Xaml布局如下:
&Grid.ColumnDefinitions&
&ColumnDefinition Width=&9*&/&
&ColumnDefinition Width=&24&/&
&ColumnDefinition Width=&10*&/&
&/Grid.ColumnDefinitions&
&ComboBox Name=&cbbHour& Grid.Column=&0&/&
&Label Content=&:& Grid.Column=&1&/&
&ComboBox Name=&cbbMinute& Grid.Column=&2&/&
BehindCode新建一个名称为Time的依赖属性,如下:
public string Time
get { return (string)GetValue(TimeProperty); }
set { SetValue(TimeProperty, value); }
public static readonly DependencyProperty TimeProperty =
DependencyProperty.Register(&Time&,
typeof(string),
typeof(TimePicker),
new PropertyMetadata(defaultValue: &00:00&,
propertyChangedCallback: null,
coerceValueCallback: coerceValueCallback));
private static object coerceValueCallback(DependencyObject d, object baseValue)
if (baseValue != null)
var control = d as TimeP
var times = baseValue.ToString().Split(':');
control.cbbHour.SelectedItem = times[0];
control.cbbMinute.SelectedItem = times[1];
return baseValue.ToString();
return baseV
这里详细介绍一下PropertyMetadata的三个参数:defaultValue:默认值,不用介绍了;propertyChangedCallback:属性变化后的通知事件,这里不需要任何通知,所以传入null值;coerceValueCallback:这是属性值新值绑定时,通知事件,这里使用得到的值来给控件赋值。到这里Time依赖属性也就完成一半了。
TimePicker属性依赖属性Time的绑定
绑定方式很简单,如下图。若Time是一个普通的.net属性而非依赖属性的话,是不能这样使用绑定方式的。
&local:TimePicker HorizontalAlignment=&Left& Margin=&137,38,0,0& VerticalAlignment=&Top& Width=&161&
Time=&{Binding StartTime,Mode=TwoWay}&/&
假设添加在TimePicker后台添加一个Code的普通属性,使用绑定的话,会出现如下的状况。
依赖属性使用是有一定限制的,就是他注册的类对象,也就是上文的ownerclass必须继承DependencyObject 这个基类,不过不用担心,WPF大部分元素都间接的集成这个基类。
本文实现的TimePicker控件可以在一些情况下解决WPF下没有Time选择控件的问题。
如果,您认为阅读这篇博客让您有些收获,请点击下面的【推荐】和 【关注】按钮,感谢大家的支持,我是朝兮兮。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示}

我要回帖

更多关于 wpf 依赖项属性 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信