2

デフォルトのコンストラクターがないMyListYExtensionマークアップ拡張機能があります。したがって、コンストラクタ構文でのみ作成できます。別のGetValueExtensionマークアップ拡張機能は、必要な変換を実行できるように、要求された値のターゲットタイプを判別しようとします。たとえば、2番目の拡張機能の値をDouble型のプロパティに割り当てると、GetValueExtensionはそれを理解し、「2」ではなく2.0を返します。ダミーの例:

{MyListX Capacity={GetValue ListCapacityParam}}    

GetValueExtensionをプロパティに割り当てると、すべてうまくいきます。次に、MarkupExtension.ProvideValue内でターゲットタイプにアクセスできます。

((IProvideValueTarget)serviceProvider).TargetProperty.PropertyType

しかし、MyListYExtensionのコンストラクターのパラメーターとしてGetValueExtensionを適用すると、TargetPropertyはnullになります。

<!-- 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 に答える