2012-07-03 81 views
2

我有MyListYExtension沒有默認構造函數的標記擴展。因此它可以僅用構造函數語法創建。 另一個GetValueExtension標記擴展嘗試確定要求的目標類型的值,以便它可以進行必要的轉換。例如,如果將第二個擴展的值分配給類型的屬性,則雙倍,GetValueExtension理解它並返回2.0而不是「2」。假例如:訪問MarkupExtension.ProvideValue中的構造函數參數

{MyListX Capacity={GetValue ListCapacityParam}}  

一切順利,如果我分配GetValueExtension一個屬性。然後目標類型通過

((IProvideValueTarget)serviceProvider).TargetProperty.PropertyType 

是MarkupExtension.ProvideValue內訪問,但是當我申請GetValueExtensionMyListYExtension的構造函數的參數,然後TargetProperty爲空:

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

當XAML解析器將值分配給屬性時,它將執行默認轉換。 但是,它從標記擴展中獲取值時不會執行此操作。它導致它不能分配的例外,例如字符串值來雙重屬性。 爲了避免出現這種情況,我嘗試模擬默認轉換,但目標類型需要知道。

我無法找到任何解決方法,以確定內MarkupExtension.ProvideValue調用的實際類型的構造函數的參數的。

我可以修改GetValueExtension但不MyListYExtension

我能做些什麼來解決這個問題?

回答

1

它看起來像雞和雞蛋的問題。問題是構造函數可能被重載,爲了找到合適的構造函數,框架需要知道你正在傳入的參數的類型。

換句話說,在調用ProvideValue時,不知道將使用哪個構造函數,因此無法提供有關目標類型的信息。

+1

從概念上講,這是真的,你是對的。注意:默認情況下,默認情況下不支持默認「false」並將其設置爲「true」的[XamlSchemaContext.SupportMarkupExtensionsWithDuplicateArity](http://goo.gl/Z0YGA)屬性*。這意味着他們可以確定arity所需的構造函數(它接受的參數的數量),從而確定擴展的目標類型。但是,這可能會成爲未來支持複製品的障礙(雞肉和雞蛋被提及)。 –