【发布时间】:2013-08-11 09:05:45
【问题描述】:
注册依赖属性时,可以使用overload of Register that accepts a validation callback。
如果验证回调为某个值返回 false,则将该值分配给依赖项属性将失败,并且将抛出 ArgumentException,抱怨无效的属性值。
现在,虽然ArgumentException 在某些情况下是合适的类型,但在某些情况下应该使用一些特殊的异常类型。特别是,我声明了一个enum 类型的属性,处理不受支持的值的正确方法是抛出InvalidEnumArgumentException。更重要的是,我正在实现一个接口,该接口将 enum 属性显示为 CLR 属性,并且在该属性的 doc cmets 中,需要为无效值抛出 InvalidEnumArgumentException。
我看到的三个解决方案是:
- 更改接口文档以允许更通用的异常类型。 这是不整洁的,我认为作为“解决方案”是不可接受的,因为它违背了拥有和记录专门的异常类型的目的。否则,我也可以在我的文档中的任何位置写
Exception,然后让 API 用户猜测和/或尝试实际抛出哪个。 - 从使用依赖属性注册的验证值回调返回
false(因此在通过SetValue更改属性值时会导致ArgumentException,并在CLR属性包装器的设置器中抛出InvalidEnumArgumentException。由于不同的原因,这是不整洁的,因为 CLR 属性包装器不应该包含任何它们自己的逻辑,除了调用GetValue/SetValue。让依赖属性本身的行为与访问它时不同似乎不一致通过其 CLR 属性设置器。 - 在验证值回调中抛出
InvalidEnumArgumentException,而不是返回false。 这是我现在使用的解决方案。
我已经尝试了第三种解决方案,它似乎有效。唯一的缺点可能是丢失了默认的异常消息,不过这似乎是较小的邪恶。
我的问题是:像这样从验证值回调中抛出是否有任何我不知道的副作用,这会让我(或者更确切地说,我的代码)陷入困境?
【问题讨论】:
标签: .net wpf dependency-properties