我有MyListYExtension沒有默認構造函數的標記擴展。因此它可以僅用構造函數語法創建。 另一個GetValueExtension標記擴展嘗試確定要求的目標類型的值,以便它可以進行必要的轉換。例如,如果將第二個擴展的值分配給類型的屬性,則雙倍,GetValueExtension理解它並返回2.0而不是「2」。假例如:訪問MarkupExtension.ProvideValue中的構造函數參數
{MyListX Capacity={GetValue ListCapacityParam}}
一切順利,如果我分配GetValueExtension一個屬性。然後目標類型通過
((IProvideValueTarget)serviceProvider).TargetProperty.PropertyType
是MarkupExtension.ProvideValue內訪問,但是當我申請GetValueExtension爲MyListYExtension的構造函數的參數,然後TargetProperty爲空:
<!-- no default constructor in MyListY -->
<!-- the first parameter of MyListY is "int capacity" -->
{MyListY {GetValue ListCapacityParam}}
當XAML解析器將值分配給屬性時,它將執行默認轉換。 但是,它從標記擴展中獲取值時不會執行此操作。它導致它不能分配的例外,例如字符串值來雙重屬性。 爲了避免出現這種情況,我嘗試模擬默認轉換,但目標類型需要知道。
我無法找到任何解決方法,以確定內MarkupExtension.ProvideValue調用的實際類型的構造函數的參數的。
我可以修改GetValueExtension但不MyListYExtension。
我能做些什麼來解決這個問題?
從概念上講,這是真的,你是對的。注意:默認情況下,默認情況下不支持默認「false」並將其設置爲「true」的[XamlSchemaContext.SupportMarkupExtensionsWithDuplicateArity](http://goo.gl/Z0YGA)屬性*。這意味着他們可以確定arity所需的構造函數(它接受的參數的數量),從而確定擴展的目標類型。但是,這可能會成爲未來支持複製品的障礙(雞肉和雞蛋被提及)。 –