3

注册依赖属性时,可以使用接受验证回调的重载。Register

如果该验证回调返回false一个值,则将该值分配给依赖属性将失败并ArgumentException抛出 an ,抱怨无效的属性值。

现在,虽然ArgumentException在某些情况下是合适的类型,但在某些情况下应该使用一些特殊的异常类型。特别是,我声明了一个enum类型的属性,处理不受支持的值的正确方法是抛出一个InvalidEnumArgumentException. 更重要的是,我正在实现一个接口,该接口将该enum属性显示为 CLR 属性,并且在该属性的文档注释中,需要InvalidEnumArgumentException为无效值抛出一个。

我看到的三个解决方案是:

  • 更改接口文档以允许更通用的异常类型。这是不整洁的,我认为作为“解决方案”是不可接受的,因为它违背了拥有和记录专门的异常类型的目的。否则,我也可以Exception在我的文档中的任何地方写,让 API 用户来猜测和/或尝试实际抛出哪个。
  • false从使用依赖属性注册的验证值回调返回(因此在通过更改ArgumentException属性值时会导致SetValue一个它们自己的逻辑,而不是调用/ 。让依赖属性本身的行为与通过其 CLR 属性设置器访问它时的行为不同似乎不一致。InvalidEnumArgumentExceptionGetValueSetValue
  • 在验证值回调中抛出一个InvalidEnumArgumentException而不是返回false这是我现在使用的解决方案。

我已经尝试了第三种解决方案,它似乎有效。唯一的缺点可能是丢失了默认的异常消息,但这似乎是较小的邪恶。

我的问题是:像这样从验证值回调中抛出是否有任何我不知道的副作用,并且会让我(或者更确切地说,我的代码)陷入困境?

4

1 回答 1

1

我认为您可以从验证回调中抛出更具体的异常。只是反映 WPF 代码,它看起来像这样的伪代码:

if (!validateValueCallback(newValue))
    throw new ArgumentException();

因此,如果您的验证回调抛出,我看不出它会如何导致任何问题。

于 2013-08-09T14:23:21.900 回答