1

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

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

我们可以ValidateValueCallback在注册依赖属性时提供一个委托。这调用了我们出处的静态方法,该方法采用单个参数对象值,足以进行上下文独立检查,例如“秒必须在 0-59 范围内”。

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

在这种情况下我们应该怎么做?在 propdp 设置器中处理这将是微不足道的。

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

MSDN 中似乎确实有一些关于这个主题的材料,但我没有时间考虑它需要的内容。

4

1 回答 1

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;
}
于 2013-01-11T04:55:06.867 回答