假设我有以下DependencyObject类型,
public class Test : DependencyObject
{
public int Order
{
get { return (int)GetValue(OrderProperty); }
set { SetValue(OrderProperty, value); }
}
public static readonly DependencyProperty OrderProperty =
DependencyProperty.Register("OrderProperty",
typeof(int),
typeof(Test),
new FrameworkPropertyMetadata(6,
new PropertyChangedCallback(OnOrderPropertyChanged),
new CoerceValueCallback(OnCoerceValueCallBack)),
new ValidateValueCallback(OnValidateValueCallBack));
static void OnOrderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Console.WriteLine("OnOrderPropertyChanged");
}
static object OnCoerceValueCallBack(DependencyObject d, object baseValue)
{
Console.WriteLine("OnCoerceValueCallBack");
return 200;
}
static bool OnValidateValueCallBack(object value)
{
Console.WriteLine("OnValidateValueCallBack");
int iValue = (int)value;
return iValue > 5;
}
}
当我创建 Test 的实例时,我看到OnValidateValueCallBack
被调用两次而OnCoerceValueCallBack
根本没有被调用。基于我所看到的,我想当我创建实例时,WPF将调用OnValidateValueCallBack
来检查默认值是否有效,如果是,它将使用默认值并且不会调用CoerceValueCallback
那么,OnValidateValueCallBack
的第二次召唤来自哪里?
答案 0 :(得分:1)
我可以确认这种行为。注册依赖项属性后,WPF的内部调用验证回调。无论传递的元数据是什么,始终会发生一次通话。 第二次调用仅在使用元数据传递的默认值时发生。
最初我认为第一次调用是由于WPF的内部初始化,所以它始终是该类型的默认值。不是这种情况! 第一次调用中传递的对象是类型的默认值,或者是元数据中指定的默认值。第二个调用似乎更合乎逻辑,只是传递默认值。
注册时不会调用强制或更改的回调。
第一次通话的用途对我来说是一个谜。
在msdn上