代码改变世界

WPF附加属性

2012-12-27 14:38  BreakChen  阅读(2687)  评论(0编辑  收藏  举报

1、定义:一个属性原来不属于某个对象,但由于某种需求而被后来附加上去。附加属性的本质是依赖属性。

2、作用:将属性与数据类型解耦,让数据类型的设计的更加灵活。

3、举例:Human,School。Human中的一个人,他如果在学校里,就会有成绩等;如果在公司里,他就有部门等。此时的成绩和部门就是附加属性。

4、使用

       4.1) 使用DependencyProperty. RegisterAttached 方法向属性系统注册附加属性。RegisterAttached方法有三种重载的实现方式。最常用的是使用指定的属性名称属性类型和属性所有者的类型来注册附加属性。

       4.2) 实现static型的设置属性值的方法。如下面代码中的GetGrade方法和SetGrade方法。这两个方法也可以不用实现,而在调用的时候直接使用GetValue方法和SetValue方法来实现,但是这样不符合常规的思维方式。一般不会这么使用。

       4.3) 调用的时候就可以使用SetGrade方法向一个对象动态地添加属性了。例如下面代码中的Human类中原先没有Grade这么一个属性,使用School类中的附加属性,则可以使School中的人具有Grade这个属性。

代码如下:School类

 

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);

}

public static readonly DependencyProperty GradeProperty =DependencyProperty.RegisterAttached("Grade", typeof(int), typeof(School), new UIPropertyMetadata(0));

}

 

Human类

 

class Human:DependencyObject

{

}

 

附加属性的使用

 

private void Button_Click(object sender, RoutedEventArgs e)

{

Human human = new Human();

School.SetGrade(human, 6);

int grade = School.GetGrade(human);

MessageBox.Show(grade.ToString());

}

 

       4.4) 当然附加属性也可以使用Binding依赖在其他数据对象上。

 

注:附加属性是不同的对象使用者赋予对象的属性。这些属性可以动态加载与卸载。

 

说明:本文从<work hard work smart>修改而来。在文中作者添加了部分操作过程相关的内容。