将setter行为添加到依赖项属性

时间:2013-01-11 01:52:48

标签: wpf silverlight dependency-properties

我们建议不要向依赖属性包装器的访问器方法添加行为,因为可以通过直接调用Get / SetValue来绕过它们。

好的,这是合理的。那么我们把这种行为放在哪里?

我们可以在注册依赖项属性时提供ValidateValueCallback委托。这会调用我们的起源的静态方法,该方法接受单个参数对象值,足以进行上下文无关的检查,例如“秒必须在0-59范围内”。

有时您需要依赖于实例的上下文信息,例如Day的有效范围取决于Month的实例值。

在这种情况下我们应该做什么?这在propdp setter中处理起来是微不足道的。

下面已经提出过PropertyChanged事件可能用于这种验证,这实际上就是我在提出这个问题的情况下所做的。但是,这很难看,因为在此阶段,更改已提交给模型,因此必须维护撤消堆栈以提供对先前值的访问。

MSDN上似乎有一些关于这个主题的材料,但我没有时间给它所需要的考虑。

1 个答案:

答案 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;
}