- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我有以下 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
的第二次调用从何而来?
最佳答案
我可以确认这种行为。注册依赖属性后,WPF 的内部调用验证回调。 一个调用总是发生,无论传递的元数据如何。 仅当通过元数据传递默认值时才会发生第二次调用。
本来我以为第一次调用是因为WPF内部初始化,所以一直是类型的默认值。不是这种情况! 在第一次调用中传递的对象要么是类型的默认值,要么是元数据中指定的默认值。第二次调用似乎更合乎逻辑,只是传递了默认值。
注册时不会调用任何强制或更改的回调。
第一次调用的用途对我来说是个谜。
Relevant (unanswered) question在 msdn 上。
关于c# - 为什么 ValidateValueCallback 被调用了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3801088/
注册依赖属性时,overload of Register that accepts a validation callback可以使用。 如果该验证回调为某个值返回 false,则将该值分配给依赖项属
假设我有以下 DependencyObject 类型, public class Test : DependencyObject { public int Order {
我向名为 A 的 DependencyProperty 添加了一个 ValidateValueCallback。现在在验证回调中,应将 A 与名为 B 的 DependencyProperty 的值进
我知道CoerceValueCallback用于更正一个值和 ValidateValueCallback将返回真或假。但我的问题是为什么我们需要 ValidatevalueCallback ?我们可以
我是一名优秀的程序员,十分优秀!