Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 从validateValueCallback抛出时是否发生了任何错误?_.net_Wpf_Dependency Properties - Fatal编程技术网

.net 从validateValueCallback抛出时是否发生了任何错误?

.net 从validateValueCallback抛出时是否发生了任何错误?,.net,wpf,dependency-properties,.net,Wpf,Dependency Properties,注册依赖项属性时,可以使用 如果该验证回调为某个值返回false,则将该值分配给依赖项属性将失败,并将抛出一个,抱怨该属性值无效 现在,虽然在某些情况下,ArgumentException是合适的类型,但在某些情况下应该使用一些特殊的异常类型。特别是,我声明了一个enum类型的属性,处理不支持的值的正确方法是抛出一个。此外,我正在实现一个接口,该接口将enum属性显示为CLR属性,并且在该属性的文档注释中,需要为无效值抛出InvalidEnumArgumentException 我看到的三种解决

注册依赖项属性时,可以使用

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

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

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

  • 更改接口文档以允许更通用的异常类型。这是不整洁的,我认为不可接受是一个“解决方案”,因为它违背了<强>和记录<>强>特殊异常类型的目的。否则,我也可以在我的文档中的任何地方编写,让API用户猜测和/或尝试实际抛出哪一个
  • 从使用dependency属性注册的验证值回调返回
    false
    (因此,通过更改属性值时会导致
    ArgumentException
    ,并在CLR属性包装器的setter中引发
    InvalidEnumArgumentException
    。这是不整洁的,原因不同,因为CLR属性包装器除了调用/,不应包含任何自己的逻辑。这对ha来说似乎不一致。)ve依赖项属性本身的行为与通过其CLR属性设置程序访问它时的行为不同
  • 在validate value回调中抛出一个
    InvalidEnumArgumentException
    ,而不是返回
    false
    。这就是我现在使用的解决方案
我已经尝试了第三种解决方案,它似乎是有效的。唯一的缺点可能是丢失默认的异常消息,这似乎是较小的缺点


我的问题是:像这样从validate-value回调抛出是否有任何我不知道的副作用,并且会让我(或者更确切地说,是我的代码)产生副作用遇到麻烦了吗?

我认为您可以从验证回调中抛出一个更具体的异常。只需回顾一下WPF代码,它看起来像以下伪代码:

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

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

实际代码看起来比这复杂得多,但它确实可以归结为您编写的代码,在抛出异常的情况下没有任何特定的预防措施。因此,最好这样检查,接受:-)+感谢Abe。MSDN声明“如果这些操作调用了验证回调,并且返回false,那么将引发异常。”但它没有说明引发了什么类型的异常!