附加属性是说一个属性本来不属于某个对象,但由于某种需求而被后来附加上。也就是把对象放入一个特定环境后对象才具有的属性(表现出来就是被环境赋予的属性)就称为附加属性(Attached Properties)。
附加属性的作用就是将属性与数据类型(宿主)解耦,让数据类型的设计更加灵活。
附加属性的本质就是依赖属性,二者仅在注册和包装器上有一点区别。
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)); }
GradeProperty就是一个DependencyProperty类型成员变量,声明时一样使用public static readonly三个关键字共同修饰。唯一的不同就是注册附加属性使用的是名为RegisterAttached的方法,但参数却与使用Register方法无异。附加属性的包装器也与依赖属性不同--依赖属性使用CLR属性对GetValue和SetValue两个方法进行包装,附加属性则使用两个方法分别进行包装--这样做完全是为了在使用的时候保持语句行文上的通畅
class Human : DependencyObject { }Human human = new Human(); School.SetGrade(human, 6); int grade = School.GetGrade(human); MessageBox.Show(grade.ToString());