我们建议不要向依赖属性包装器的访问器方法添加行为,因为可以通过直接调用Get / SetValue来绕过它们。
好的,这是合理的。那么做我们把这种行为放在哪里?
我们可以在注册依赖项属性时提供ValidateValueCallback
委托。这会调用我们的起源的静态方法,该方法接受单个参数对象值,足以进行上下文无关的检查,例如“秒必须在0-59范围内”。
有时您需要依赖于实例的上下文信息,例如Day的有效范围取决于Month的实例值。
在这种情况下我们应该做什么?这在propdp setter中处理起来是微不足道的。
下面已经提出过PropertyChanged事件可能用于这种验证,这实际上就是我在提出这个问题的情况下所做的。但是,这很难看,因为在此阶段,更改已提交给模型,因此必须维护撤消堆栈以提供对先前值的访问。
MSDN上似乎有一些关于这个主题的材料,但我没有时间给它所需要的考虑。
答案 0 :(得分:1)
我想我可能找到了一个解决方案,CoerceValueCallback
在属性发生变化之前运行,如果需要,你可以在传递之前拦截并更改值。
也许你可以尝试一下,看看它是否适合你的情况。
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(int), typeof(MainWindow), new PropertyMetadata(0, null, new CoerceValueCallback(CoercePropertyValue)));
private static object CoercePropertyValue(DependencyObject d, object value)
{
if (This != That)
{
return value;
}
return 6;
}