第4章 依赖属性(4)——属性验证

本文介绍了WPF中依赖属性的验证方法,包括ValidateValueCallback和CoerceValueCallback两种回调机制,前者用于拒绝非法值,后者则调整不合规定值。并通过Margin属性及控件宽度尺寸的Maximum属性设置为例进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

在定义任何类型的属性时,都需要面对错误设置属性的可能性。对于传统的.NET属性,可尝试在属性设置器中捕获这类问题。但对于依赖属性而言,这种方法不合适,因为可能通过WPF属性系统可使用SetValue()方法直接设置属性。

作为替代,WPF提供了两种方法来阻止非法值:

(1)ValidateValueCallback:该回调函数可接受或拒绝新值。通常用于捕获违反属性约束的明显错误。可作为DependencyProperty.Register()方法或DependencyProperty.RegisterAttached()方法的一个参数提供该回调函数。

(2)CoerceValueCallback:该回调函数可将新值修改为更能被接受的值。该回调函数通常用于为同一对象设置的依赖属性值相互冲突的问题。这些值本身可能是合法的,但同时应用它们是不相容的。为了使用这个回调函数,当创建FrameworkPropertyMetadata对象时,作为构造函数的一个参数提供该回调函数。然后这个对象被传递到DependencyProperty.Register()方法。

二、依赖属性赋值验证过程

(1)CoerceValueCallback

(2)ValidateValueCallback,该方法返回true表示合法值,false表示非法值。

(3)PropertyChangedCallback,如果前两个阶段都获得成功,就会触发该方法,此时,如果希望为其它类提供通知,可以引发更改事件。

三、验证回调

例如,对MarginProperty的属性赋值时的验证回调。

static FrameworkElement()  
{  
    FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(new Thickness(), FrameworkPropertyMetadataOptions.AffectsMeasure);  
    MarginProperty = DependencyProperty.Register("Margin", typeof(Thickness), typeof(FrameworkElement), metadata, new ValidateValueCallback(FrameworkElement.IsMarginValid));  
    ……  
} 
回调函数:
private static bool IsMarginValid(object value)
{
	Thickness thickness1 = (Thickness)value;
	return thickness1.IsValid(true,false,true,false);
}
此时若给Margin赋值为负数,则IsMarginValid方法将返回false。

四、强制回调

例如,当对控件宽度尺寸的Maximum属性进行设置时,必须使用强制以确保不能小于Minimum属性的值。

具体实例需要进一步学习,暂时先留个坑,详见书P91。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值