依赖属性的使用


依赖属性

一、为什么需要定义依赖属性:

  • 用户定义的属性一般是普通属性,常常用作Binding源;如果想要用户定义的属性作为Binding目标,则需要将该属性定义为依赖属性。
  • 而WPF提供的现成控件,之所以控件中的所有属性可以作为Binding目标,是因为WPF的所有现成控件都是实现了依赖属性的。

二、创建依赖属性的快捷方式:输入propdp,再敲两次Tab键

三、添加属性封装器:使用CLR属性对GetValue和SetValue两个方法进行包装。

1 public bool IsRotate
2 {
3   get { return (bool)GetValue(IsRotateProperty); }
4   set { SetValue(IsRotateProperty, value); }
5 }
  • 创建属性封装器时,应当只包含对SetValue()和GetValue()方法的调用,不应当添加任何验证属性、引发事件的功能代码等。这是因为额外的功能代码会导致使用时忽略属性封装器,而直接调用SetValue()和GetValue()方法。想要验证数据或引发事件的正确位置,是使用依赖属性回调函数。

四、依赖属性的定义:

(1)利用快捷键生成的依赖属性模板如下: 

1 public static readonly DependencyProperty MyPropertyProperty =
2             DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0));

(2)注册依赖属性的方式有多种,上述是最常用的一种。注册参数最多有五个:

1 public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata, ValidateValueCallback validateValueCallback);

(3)在模板基础上编辑自己的依赖属性IsRotate:

1 public static readonly DependencyProperty IsRotateProperty =
2             DependencyProperty.Register("IsRotate", typeof(bool), typeof(XVision2DRotate), new PropertyMetadata(false));
  • 参数一(IsRotate):要注册的依赖属性的名称。
  • 参数二(typeof(bool)):声明属性IsRotate的类型是bool。
  • 参数三(typeof(XVision2DRotate)):依赖属性IsRotate的所有者类型,即所属的类是XVision2DRotate。
  • 参数四的类型是PropertyMetadata类:该类有5个重载的构造函数,参数最多是三个,示例中使用的是传参为DefaultValue的构造函数。
public PropertyMetadata(object defaultValue);

public PropertyMetadata(object defaultValue, PropertyChangedCallback propertyChangedCallback, CoerceValueCallback coerceValueCallback);
  •  DefaultValue:依赖属性未被显式赋值时,使用该默认值。
  •  PropertyChangedCallback:依赖属性的值被改变之后,此委托会被调用,此委托可关联一个影响函数。
  •  CoerceValueCallback:依赖属性值被强制改变时此委托会被调用,对赋值进行检查,强制对值进行赋值,返回值为Object类型,这个才是要赋给属性的值,此委托可关联一个影响函数。

五、属性value更改后,发生校正的流程:

六、依赖属性的使用

(1)在XVision2DRotate.xaml中可将IsRotate作为Binding源:

Visibility="{Binding IsRotate,Converter={StaticResource B2VConverter}}"

(2)当XVision2DRotate.xaml作为UserControl嵌入到MainWindow.xaml时,可将IsRotate作为Binding目标,这里就体现到依赖属性的作用啦:

<local:XVision2DRotate IsRotate="{Binding path=Text,Converter={StaticResource T2BConverter}}">

效果:这样我们就可以在MainWindow.xaml中随意给IsRotate赋值了,这里是绑定了一个普通属性Text。IsRotate值发生变化后,会触发XVision2DRotate中一系列的Value校正,校正完成后的Object赋值给Visibility。

 

文章来源:https://www.cnblogs.com/LXLR/p/15628125.html

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
管理员
上一篇:【.NET 与树莓派】MPD 的 Mini-API 封装
下一篇:C# 配置文件增加自定义节点
评论列表

发表评论

评论内容
昵称:
关联文章

依赖属性使用
附加属性使用
必须使用适当属性或方法修改referer标头
.NET Core 复制nuget包依赖dll到输出目录
.Net Core依赖注入
NPM依赖说明dependencies和devDependencies区别
.NET Core 深入理解依赖注入 services.AddTransient,services.AddScoped,services.AddSingleton
System.BadImageFormatException:“未能加载文件或程序集 或它某一个依赖项。试图加载格式不正确程序
未能加载文件或程序集“CefSharp.Core.dll”或它某一个依赖项。
css样式首行缩进2个长度宽度 text-indent 属性
C# 利用Autofac批量接口注入依赖【学习记录】
CSS cursor 属性
WPF 引用第三方库控件在设计器加上设计时数据和属性
WPF 双向绑定到非公开 set 方法属性在 NET 45 和 NET Core 行为不同
如何更改winform中GroupboxControls属性内控件排序
vue自定义组件props中设置object属性默认值:
Quartz在.NET中使用
Devexpress使用自带图标库图标
使用.NET 6开发TodoList应用(24)——实现基于JWTIdentity功能
c# Quartzs定时器简单使用

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码