【问题标题】:Adding setter behaviour to dependency properties将 setter 行为添加到依赖属性
【发布时间】:2012-12-25 13:53:06
【问题描述】:

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

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

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

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

在这种情况下我们应该怎么做?这在 propdp 设置器中处理起来很简单。

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

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

【问题讨论】:

  • 在注册属性以处理所有逻辑时,您不能只在属性元数据中使用PropertyChanged 事件,因为它会传入所有者和更改的值(旧值、新值)
  • 也许,但是发生在 值被提交给模型之后,所以为了让它工作,我必须全力以赴并实现命令和撤消堆栈。

标签: wpf silverlight dependency-properties


【解决方案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;
}

【讨论】:

  • 对相关的 msdn 信息的粗略检查让我觉得你在做某事。等我回家再看看。
  • 如果你问我,这很不整洁,但它有效,甚至是官方祝福的方法。
猜你喜欢
  • 2017-04-01
  • 2014-07-29
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 2021-03-10
  • 2010-11-20
  • 1970-01-01
  • 2012-11-10
相关资源
最近更新 更多