using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows;
namespace Callback_Validation_DPs
{
#region 依赖属性简单调用 步骤
public class SimpleDPClass : Control//DependencyObject
{
public SimpleDPClass() : base() { }
public static readonly DependencyProperty SimpleDPProperty =
DependencyProperty.Register("SimpleDP",
typeof(double),
typeof(SimpleDPClass),
new FrameworkPropertyMetadata(
Double.NaN,//(double)0.0,
FrameworkPropertyMetadataOptions.None,
new PropertyChangedCallback(OnValueChanged),
new CoerceValueCallback(CoerceValue)
),
new ValidateValueCallback(IsValidValue));
public double SimpleDP
{
get { return (double)GetValue(SimpleDPProperty); }
set { SetValue(SimpleDPProperty, value); }
}
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MessageBox.Show("当值改变时,我们可以做的一些操作,具体可以在这里定义:" + e.NewValue);
}
private static object CoerceValue(DependencyObject d, object value)
{
MessageBox.Show("对值进行限定,强制值:" + value);
return value;
}
private static bool IsValidValue(object value)
{
MessageBox.Show("验证值是否通过,返回bool值,如果返回True表示严重通过,否则会以异常的形式暴露:" + value);
return true;
}
}
#endregion
#region 解说注册属性依赖方法里的第三个参数
// 事实上,除了PropertyMetadata以外,常见的还有FrameworkPropertyMetadata,UIPropertyMetadata。
// 他们的继承关系是F->U->P。
// 其中以FrameworkPropertyMetadata参数最多,亦最为复杂。
//FrameworkPropertyMetadata的构造函数提供了很多重载,我们挑选最为复杂的重载来看它到底有哪些参数以及提供了哪些功能:
// public FrameworkPropertyMetadata(object defaultValue,
// FrameworkPropertyMetadataOptions flags,
// PropertyChangedCallback propertyChangedCallback,
// CoerceValueCallback coerceValueCallback,
// bool isAnimationProhibited,
// UpdateSourceTrigger defaultUpdateSourceTrigger);
// 其中第一个参数是默认值,最后两个参数分别是是否允许动画,
//以及绑定时更新的策略(在Binding当中相信大家并不陌生),
//这个不详细解释了。重点看一下里第三、四两个参数,两个 CallBack的委托。
//结合前面Register的时候提到的ValidateValueCallback共组成三大”金刚“,
//这三个Callback分别代表Validate(验证),PropertyChanged(变化通知)以及Coerce(强制)。
//当然,作为 Metadata,FrameworkPropertyMetadata只是储存了该依赖属性的策略信息,
//WPF属性系统会根据这些信息来提供功能并在适当的时机回调传入的delegate,
//所以最重要的还是我们定义的这些方法,通过他们传入委托才能起到真正的作用。
#endregion
}
09-21