WPF依赖属性2
前一个博客,介绍了依赖属性的基本定义,在定义的过程中register中的的两个参数,并没有传入参数,不知道其是用来干什么的,以下,我们将介绍这两个参数的真正用途FrameworkPropertyMetadata和ValidateValueCallback。
1、FrameworkPropertyMetadata 参数
FrameworkPropertyMetadata是一个重要的参数,其用于配置当前的依赖属性的特性,这个对象的有很多构造函数,我们使用一个比较常用的构造函数
public FrameworkPropertyMetadata( Object defaultValue, FrameworkPropertyMetadataOptions flags, PropertyChangedCallback propertyChangedCallback )
那么FrameworkPropertyMetadata 的作用是什么呢?我们看看这个FrameworkPropertyMetadata对象的几个属性:
| 编号 | 名称 | 说明 |
| 1 | AffectsArrange | 获取或设置一个值,该值指示依赖项属性是否会影响布局引擎运行期间的排列处理过程。 |
| 2 | AffectsMeasure | 获取或设置一个值,该值指示依赖项属性是否会影响布局引擎运行期间的测量处理过程。 |
| 3 | AffectsParentArrange | 获取或设置一个值,该值指示依赖项属性是否会影响布局引擎运行期间其父元素布局的排列处理过程。 |
| 4 | AffectsParentMeasure | 获取或设置一个值,该值指示依赖项属性是否会影响布局引擎运行期间其父元素布局的测量处理过程。 |
| 5 | AffectsRender | 获取或设置一个值,该值指示依赖项属性是否会以某种方式(这种方式不会具体影响排列或测量,但将请求重绘)对常规布局造成潜在影响。 |
| 6 | BindsTwoWayByDefault | 获取或设置一个值,该值指示默认情况下属性是否双向绑定。 |
| 7 | CoerceValueCallback | 获取或设置对此元数据中所指定 CoerceValueCallback 实现的引用 |
| 8 | DefaultUpdateSourceTrigger | 获取或设置在应用具有该元数据的属性的绑定时要使用的 UpdateSourceTrigger 的默认值,这些绑定的 UpdateSourceTrigger 设置为 Default。 |
| 9 | DefaultValue | 获取或设置依赖项属性的默认值.(继承自 PropertyMetadata。) |
| 10 | IsAnimationProhibited | 获取或设置一个值,声明是否应在应用了包含元数据实例的依赖项对象上禁用动画。(继承自 UIPropertyMetadata。) |
| 11 | IsDataBindingAllowed | 获取一个值,该值指示依赖项属性是否支持数据绑定。 |
| 12 | IsNotDataBindable | 获取或设置一个值,该值指示依赖项属性是否支持数据绑定。 |
| 13 | IsSealed | 获取一个值,该值确定是否已通过某种方式将元数据应用于属性,从而导致该元数据实例变为不可变状态。(继承自 PropertyMetadata。) |
| 14 | Journal | 获取或设置一个值,该值指示该属性是否包含应用程序可以或应该存储为日记实现一部分的日记信息。 |
| 15 | OverridesInheritanceBehavior | 获取或设置一个值,该值指示属性值继承计算是否应跨越元素的逻辑树中的某些内容边界。 |
| 16 | PropertyChangedCallback | 获取或设置对此元数据中所指定 PropertyChangedCallback 实现的引用。 (继承自 PropertyMetadata。) |
| 17 | SubPropertiesDoNotAffectRender | 获取或设置一个值,该值指示依赖项属性的子属性是否影响包含对象的呈现。 |
我们对几个关键属性进行分析:
AffectsArrange、AffectsMeasure、AffectsParentArrange、AffectsParentMeasure、AffectsRender。
五个属性,主要是用于定义当前依赖属性的改变,是否影响控件调整。如果设置AffectsArrange=true,属性的变化会造成控件重新排列。
BindsTwoWayByDefault: 指定属性是否是双向绑定,这个会在绑定的地方详细讲解
CoerceValueCallback:一个回调函数,用于在验证依赖属性之前尝试“纠正”属性值。我们可以简单的案例说明:
class Example:DependencyObject
{
static Example()
{
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
metadata.DefaultValue = "example";
metadata.CoerceValueCallback = new CoerceValueCallback(CoerceMaxValue);
NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Example), metadata);
}
public static DependencyProperty NameProperty;
public String Name {
set { SetValue(NameProperty, value); }
get { return (string)GetValue(NameProperty); }
}
private static object CoerceMaxValue(DependencyObject d, object baseValue)
{
string base1 = baseValue.ToString();
if (base1.Length>)
{
return "err";
}
return baseValue;
}
}
我们使用这个依赖属性
Example e = new Example();
e.Name = "";
MessageBox.Show(e.Name);
e.Name = "";
MessageBox.Show(e.Name);
我们可以到,第一个弹出框显示333,第二个弹出框,显示err,所以CoerceValueCallback的作用就是验证传入的依赖属性,并且可以修改属性,并且可以用来修改类型,可以把字符串red修改为color对象。
IsAnimationProhibited、IsDataBindingAllowed、IsSealed、IsSealed、SubPropertiesDoNotAffectRender:
标记依赖属性的一些特性,比如是否可以应用与动画或者数据绑定等。
PropertyChangedCallback:
属性,这个属性比较有用,代表属性发生变化的时候,调用的函数,这个函数在CoerceValueCallback函数调用之后调用,代表属性已经确定完成的最后一个步骤,我们简单案例如下:
static Example()
{
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
metadata.DefaultValue = "example";
metadata.CoerceValueCallback = new CoerceValueCallback(CoerceMaxValue);
metadata.PropertyChangedCallback = new PropertyChangedCallback(OnItemsSourceChanged);
NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Example), metadata);
}
public static DependencyProperty NameProperty;
public String Name {
set { SetValue(NameProperty, value); }
get { return (string)GetValue(NameProperty); }
}
private static object CoerceMaxValue(DependencyObject d, object baseValue)
{
string base1 = baseValue.ToString();
if (base1.Length>)
{
return "err";
}
return baseValue;
}
private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MessageBox.Show("finish");
}
调用代码:
Example e = new Example();
e.Name = "";
e.Name = "";
我们可以看到,finish被弹出了两次,每次属性改变都会调用此函数。
2、ValidateValueCallback参数
在定义任何类型属性的时候,都需要面对错误设置属性的情况,对于传统属性来说,可以通过get/set方法中,对属性进行验证,但是wpf虽然也有get/set,但是其设置方式和传统属性完全不同,无法通过get/set中进行验证,那么wpf提供FrameworkPropertyMetadata中的回调函数进行判断,在CoerceValueCallback 中对值进行判断合法性,但在设置给对象之前,还需要调用ValidateValueCallback函数,最终确定是否修改值,ValidateValueCallback回调会返回true和false,赋值和不赋值,假如赋值发生修改,则会调用PropertyChangedCallback回调,基本案例如下:
class Example:DependencyObject
{
static Example()
{
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
metadata.DefaultValue = "example";
metadata.CoerceValueCallback = new CoerceValueCallback(CoerceMaxValue);
metadata.PropertyChangedCallback = new PropertyChangedCallback(OnItemsSourceChanged);
NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Example), metadata,new ValidateValueCallback(ValidateValue));
}
public static DependencyProperty NameProperty;
public String Name {
set { SetValue(NameProperty, value); }
get { return (string)GetValue(NameProperty); }
}
private static object CoerceMaxValue(DependencyObject d, object baseValue)
{
string base1 = baseValue.ToString();
if (base1.Length>)
{
return "err";
}
return baseValue;
}
static bool ValidateValue(object obj)
{
if (obj.ToString() == "err") { return false; }
return true;
}
private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MessageBox.Show("finish");
}
}
代码经过以上的修改,我们发现finish只会弹出一次,返回false后,则程序会抛出异常
WPF依赖属性2的更多相关文章
- WPF依赖属性详解
WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency P ...
- WPF自学入门(五)WPF依赖属性
在.NET中有事件也有属性,WPF中加入了路由事件,也加入了依赖属性.最近在写项目时还不知道WPF依赖属性是干什么用的,在使用依赖项属性的时候我都以为是在用.NET中的属性,但是确实上不是的,通过阅读 ...
- WPF依赖属性值源(BaseValueSource)
原文:WPF依赖属性值源(BaseValueSource) WPF依赖属性提供一个机制,可以获取依赖属性提供值的来源 其以BaseValueSource枚举表示 1.Default public ...
- WPF依赖属性(续)(3)依赖属性存储
原文:WPF依赖属性(续)(3)依赖属性存储 在之前的两篇,很多朋友参与了讨论,也说明各位对WPF/SL计数的热情,对DP系统各抒已见,当然也出现了一些分歧. 以下简称DP为依赖属性 ...
- WPF依赖属性(续)(1)
原文:WPF依赖属性(续)(1) 之前有写过几篇文章,详细地介绍了依赖属性的基本使用方法,如果你不想了解其内部实现机制的话,那么通过那两篇文章的介绍,足以应付平时的应用 ...
- WPF依赖属性(续)(2)依赖属性与附加属性的区别
原文:WPF依赖属性(续)(2)依赖属性与附加属性的区别 接上篇,感谢各位的评论,都是认为依赖属性的设计并不是为了节省内存,从大的方面而讲是如此.样式,数据绑定,动画样样都离不开它.这篇 ...
- 监听WPF依赖属性
原文:监听WPF依赖属性 当我们使用依赖属性的时候,有时需要监听它的变化,这在写自定义控件的时候十分有用, 下面介绍一种简单的方法. 如下使用DependencyPropertyDescripto ...
- WPF依赖属性的正确学习方法
前言 我在学习WPF的早期,对依赖属性理解一直都非常的不到位,其恶果就是,我每次在写依赖属性的时候,需要翻过去的代码来复制黏贴. 相信很多朋友有着和我相同的经历,所以这篇文章希望能帮助到那些刚刚开始学 ...
- WPF 依赖属性前言
WPF 依赖属性前言 在.net中,我们可以属性来获取或设置字段的值,不需要在编写额外的get和set方法,但这有一个前提,那就是需要在对象中拥有一个字段,才能在此字段的基础上获取或设置字段的值, ...
- WPF 依赖属性
依赖属性,简单的说,在WPF控件应用过程中,界面上直接可以引用的属性 如:<Button Content="aaa"></Button> Content称为 ...
随机推荐
- css 的包含块 、负外边距,字体,文本行高
一.包含块 目的:确定元素的位置和相对大小(%) 1.正常文档流元素和浮动元素 ---- 父元素的 content-box 2.绝对定位元素 ---- 父元素的 padding-box 3.固定定位元 ...
- Eclipse详细设置护眼背景色和字体颜色并导出
Eclipse详细设置护眼背景色和字体颜色并导出 Eclipse是一款码农们喜闻乐见的集成开发平台,但是其默认的主题和惨白的背景色实在是太刺激眼球了.下面,将给大家详细介绍如何设置成护眼主题的方法,也 ...
- 二.GC相关之Java内存模型
根据上节描述的问题,我们知道其最终原因是GC导致的.本节我们就先详细探讨下与GC息息相关的Java内存模型. 名词解释:变量,理解为java的基本类型.对象,理解为java new出来的实例. Jav ...
- 一步一步深入理解Dijkstra算法
先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...
- 【原创】Easyui tree filter 过滤本地数据无效的原因
Easyui tree filter 过滤本地数据无效的解决方式 正确使用方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- 超超超简单的bfs——POJ-3278
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 89836 Accepted: 28175 ...
- ABP+AdminLTE+Bootstrap Table权限管理系统第六节--abp控制器扩展及json封装
一,控制器AbpController 说完了Swagger ui 我们再来说一下abp对控制器的处理和json的封装. 首先我们定义一个控制器,在新增控制器的时候,控制器会自动继承自AbpContro ...
- 1.配置vsftp服务器
1.安装 vsftp yum -y install ftp vsftpd 2.查看配置文件所在路径 rpm -qc vsftpd 3.备份vsftpd文件 cp vsftpd.conf vsftpd. ...
- java中string.trim()函数的使用
java中string.trim()函数的的作用是去掉字符串开头和结尾的空格,防止不必要的空格导致的错误. public static void main(String arg[]){ String ...
- C#设计模式(3)-工厂方法模式
引言 上一篇介绍了设计模式中的简单工厂模式-C#设计模式(2)-简单工厂模式,本篇将介绍工厂方法模式,在简单工厂模式下进行改造: 工厂方法模式简介 工厂方法(FactoryMethod)模式:定义一个 ...