2

我有没有默认构造函数的MyListYExtension标记扩展。因此只能使用构造函数语法创建它。另一个GetValueExtension标记扩展尝试确定所要求的值的目标类型,以便它可以进行必要的转换。例如,如果您将第二个扩展的值分配给Double类型的属性,GetValueExtension会理解它并返回 2.0 而不是“2”。虚拟示例:

{MyListX Capacity={GetValue ListCapacityParam}}    

如果我将GetValueExtension分配给一个属性,一切都会好起来的。然后可以通过MarkupExtension.ProvideValue访问目标类型

((IProvideValueTarget)serviceProvider).TargetProperty.PropertyType

但是当我应用GetValueExtension作为 MyListYExtension 构造函数的参数时 TargetProperty空:

<!-- no default constructor in MyListY -->
<!-- the first parameter of MyListY is "int capacity" -->
{MyListY {GetValue ListCapacityParam}} 

当 XAML 解析器为属性分配值时,它会执行默认转换。但是当它从标记扩展中获取值时它不会这样做。它会导致无法将字符串值分配给 double 属性的异常。为避免这种情况,我尝试模拟默认转换,但为此需要知道目标类型。

我找不到任何解决方法来确定MarkupExtension.ProvideValue调用中构造函数参数的实际类型。

我可以修改GetValueExtension但不能修改MyListYExtension

我能做些什么来解决这个问题?

4

1 回答 1

1

它看起来像鸡和蛋的问题。问题是构造函数可以重载,为了找到合适的构造函数,框架需要知道你试图传递给它的参数的类型。

换句话说,在ProvideValue调用 时,不知道将使用哪个构造函数,因此无法提供有关目标类型的信息。

于 2012-07-05T11:10:56.960 回答