我有 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 。
我该怎么做才能解决这个问题?
答案 0 :(得分:1)
它看起来像鸡和蛋的问题。问题是构造函数可以重载并且为了找到合适的构造函数,框架需要知道您尝试传递给它的参数的类型。
换句话说,在调用ProvideValue
时,不知道将使用什么构造函数,因此无法提供有关目标类型的信息。