【问题标题】:Is it appropriate to thrown an exception from CoerceValueCallback从 CoerceValueCallback 抛出异常是否合适
【发布时间】:2010-09-12 11:18:53
【问题描述】:

如果给定值无效,是否应该从CoerceValueCallback 引发异常,或者应该只使用ValidateValueCallback 进行DP 值验证?

【问题讨论】:

    标签: wpf binding dependency-properties


    【解决方案1】:

    CoerceValue 确实应该用于固定一个值(例如,将其限制在 min 和 max 之间)。我不知道抛出异常是否会使应用程序崩溃(您只需要对其进行测试以找出答案)还是框架会处理它,但无论如何我都不推荐它,因为它会违反良好的编码习惯。

    为了获得 ValidateValue 的额外信息,有时您必须在类中定义一些额外的字段。您可以绑定这些字段或在为您的 DP 设置值之前设置它们,然后在您的 ValidateValue 中您可以访问这些字段并获取所需的额外信息。这个额外的字段通过中间“层”创建和传递信息,微软似乎没问题,因为这就是他们(短视)设计框架的方式。

    我会给你一个关于新的 WPF 数据网格的例子。如果您采用标准路线并定义 RowValidationRule,您将希望有权访问 ItemsSource(您的表),以确定您的行中的给定值是否已存在于表中。这是一件非常标准的事情,但验证回调中未提供该信息。因此,您必须在验证类中创建一个字段,您可以将 DataGrid 的 ItemsSource 绑定到该字段,然后您可以在验证期间访问该字段...

    【讨论】:

    • +1 感谢您的回答。据我记得,我已经测试了在 CoerceValueCallback 中抛出异常时显示的行为。它做了我想要的,但我没有在生产代码中使用它,因为它看起来不干净。然而,在验证之前设置附加字段的解决方案在我看来也不是很方便,在某些情况下也是不可能的。但我认为这就像你写的那样,不应该使用 CoerceValueCallback,因为它不打算这样做(基于回调的名称并且没有更多信息(msdn))
    【解决方案2】:

    首先:我花了一些心思才弄清楚 DP 是指依赖属性。

    second:据我了解,CoerceValueCallback 是将属性的值固定为给定值,而不是验证值。因此,我会选择 ValidateValueCallback 进行验证。反正不叫吗?

    【讨论】:

    • CoerceValueCallback 获取有关 DP 和设置 DP 的实例的信息。这在某些情况下很有用。然而,ValidateValueCallback 只获取应该验证的值。在“正常”情况下,很明显我使用 ValidateValueCallback,但如果额外信息方便/需要,使用 CoerceValueCallback 进行验证是否合法?
    猜你喜欢
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2019-05-12
    相关资源
    最近更新 更多