一、依赖属性的意义和实现
在我开始使用WPF进行界面的开发过程中,遇到了这样一个问题:在MVVM框架下,有时需要让某一个控件从后台代码中获取某个数据,但是当这个控件又没有现成的属性可以binding的时候该怎么办呢 ?为了解决这个问题,我最后使用了自定义依赖属性的方法,通过这次测试与实践,也让我对WPF中经常使用的Binding有了更加深入的认识。
首先依赖属性的作用:作为一种特殊的属性,可以通过绑定数据的方式获得数据,因此可以不需要一个私有字段作为数据源,从而节省了内存空间,也让控件的数据传递更加自由灵活。
依赖属性的实现:
class Person:DependencyObject
{
//依赖属性对外的包装器
public int Age
{
get{(int)GetValue(AgeProperty);}
set{SetValue(AgeProperty,value);}
}
//定义依赖属性
public static readonly DependencyProperty AgeProperty =
DependencyProperty.Register("Age",typeof(int),typeof(Person),new PropertyMetadata(0));
}
1.继承DependencyObject类;
2.创建依赖属性,依赖属性的必须是public static readonly的,通过DenpendencyProperty.Register方法创建依赖属性,该方法中有多种重载,VS中默认采用三个参数的重载,这三个参数分别需要传入依赖属性包装器的名称、依赖属性的数据类型、包含此依赖属性的类的类型和依赖属性的默认值;
3.创建依赖属性的包装器,依赖属性的包装器是依赖属性对外的接口,包装器的名称也就是我们经常在XAML代码经常用来binding的属性名称;
这样就完成了一个依赖属性的实现,在使用过程中可以通过在自定义控件中添加依赖属性的方式实现对需要数据的绑定;
二、附加属性
附加属性是依赖属性的一种特殊情况,在使用WPF进行开发的时候,我们常常会使用Grid控件进行布局,当我们把其他控件放在<Grid></Grid>中进行布局的时候,这些控件就能够使用Grid.Row这样的属性,这些属性就是Grid的附加属性,而使用这些属性的是Grid中的控件,所以使用附加属性的类并非定义附加属性的类。
附加属性的实现与依赖属性相似,但是主要有两点不同:
class Person:DependencyObject
{
//附加属性对外的包装器
public static int GetAge(DependencyObject obj){return (int)obj.GetValue(AgeProperty);}
public static void SetAge(DependencyObject obj){obj.SetValue(AgeProperty,value);}
//定义附加属性
public static readonly DependencyProperty AgeProperty =
DependencyProperty.RegisterAttached("Age",typeof(int),typeof(Person),new PropertyMetadata(0));
}
1.如代码所示,附加属性的对外包装器定义了两个方法分别是GetAge和SetAge,其中Age就是我们对外包装器的名称;
2.在创建附加属性的时候,采用了RegisterAttached方法,而不是Register方法;