说明:本文是介绍WPF中的依赖属性功能,如果对依赖属性已经有了解了,可以浏览后面的文章。
为什么要介绍依赖属性
在WPF的数据绑定中,密不可分的就是依赖属性。而MVVM又是跟数据绑定紧密相连的,所以在学习MVVM之前,很有必须先学习一下依赖属性。
依赖属性(Depencency Property)是什么
先来看看MSDN上的解释:
WPF提供一组服务,这些服务可用于扩展类型的属性的功能。 这些服务统称为 WPF 属性系统。 由 WPF 属性系统提供支持的属性称为依赖属性。
通俗点来说,WPF的依赖属性就是在.NET属性的基础上进行的扩展。它除了具备.NET属性的功能之外,还具备一些其它的扩展功能,如:值验证、默认值、值修改时的回调、转换器等。
我们先来看看.NET属性,也就是平常我们在C#中使用的属性
1 public class CLRProperty 2 { 3 private int id; 4 5 public int Id 6 { 7 get => id; 8 set => id = value; 9 } 10 }
再来看看依赖属性
以Button控件的Content属性为例
1 public static readonly DependencyProperty ContentProperty = = DependencyProperty.Register("Content", typeof(object), typeof(ContentControl), new FrameworkPropertyMetadata((object)null, (PropertyChangedCallback)OnContentChanged)); 2 3 public object Content 4 { 5 get 6 { 7 return GetValue(ContentProperty); 8 } 9 set 10 { 11 SetValue(ContentProperty, value); 12 } 13 }
可以看到它也有一个get和set(即.NET的属性包装器),但是没有私有变量,而是通过GetValue和SetValue来完成取值和赋值。
在使用上依赖属性和.NET属性无异。
如有一个Button控件,命名为btn_Ok
可以在XAML中直接设置依赖属性的值
1 <Button Name="btn_Ok" Content="HelloWorld"></Button>
也可以在后台代码中设置
1 btn_Ok.Content = "HelloWorld";
如何创建依赖属性
大多数在使用WPF原生控件的情况下,我们都是使用依赖属性,而非创建它。但是在自定义控件时,可能会需要用到依赖属性功能。
依赖属性对象不能直接被实例化,因为它没有公开的构造函数,只能通过DependencyProperty.Register()方法创建实例。
我们这里以自定义一个MyButton控件为例。
1、定义表示属性的对象
注意:这里使用了static readonly关键字,且对象命名时,后面都加上Property。
1 public static readonly DependencyObject ImageProperty;
2、注册依赖属性
1 ImageProperty = DependencyProperty.Register("Image", typeof(ImageSource), typeof(MyButton),new PropertyMetadata(null, OnImagePropertyChanged));
DependencyProperty.Register函数支持多种重载,下面这是一种比较常用的重载。
1 public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);
下面来介绍一下它各个参数的作用
name:这个参数用于指定.NET属性包装器的名称
propertyType:指明依赖项属性存储什么类型的值,这里是ImageSource类型,代表图像数据
ownerType:指明此依赖属性的宿主是什么类型,这里是MyButton
typemetaData:指定此依赖属性的元数据,元数据定义依赖属性在应用于特定类型时的某些行为方面,包括默认值、值更改时的回调等。上面的代码中,typeMetadata的第一个参数代表依赖属性的默认值,设置为null,第二个参数是在值更改时的回调函数,这里是调用OnImagePropertyChanged函数。
3、添加属性包装器
1 public ImageSource Image 2 { 3 get => (ImageSource)GetValue(ImageProperty); 4 set => SetValue(ImageProperty, value); 5 }
4、使用依赖属性
XAML
1 <local:MyButton x:Name="btn_Ok" Image="logo.jpg"/>
后台代码
1 this.btn_Ok.Image = new BitmapImage(new Uri("logo.jpg", UriKind.Relative));
标签:教程,依赖,DependencyProperty,MVVM,NET,WPF,public,属性 From: https://www.cnblogs.com/zhaotianff/p/18442104