web-dev-qa-db-ja.com

XAMLでネストされたクラスのインスタンスを作成する

[〜#〜] xaml [〜#〜]ファイル(WPF UserControl)で、別のクラスで定義された内部クラス "B"を参照する方法はありますか「A」?

public class A
{
    public class B
    {
    }
}

何かのようなもの :

<local:A.B ... />

「B」はクラス「A」の「B」という名前のプロパティとして解釈されるため、この構文は機能しません。

「::」や「+」などのよりエキゾチックな構文を試しましたが、どれも機能しないようです。

現在、Silverlight 4VS201を使用しています。

よろしくお願いします。

35
Pragmateek

できれば知りたいので、探して探していました。残念ながら、私はこれを msdn で見つけました:

カスタムクラスはネストされたクラスであってはなりません。ネストされたクラスとその一般的なCLR使用構文の「ドット」は、添付プロパティなどの他のWPFやXAML機能に干渉します。

したがって、ドット演算子を使用してネストされたクラスを参照することはできないようです。 XAMLを介してその内部クラスに到達する別の方法については、まだ検索に成功していません。 :o(しかし、これはかなり興味深い問題なので、検索を続けます。運が見つかるかもしれません!:o)

32
Ashley Grenon

この質問はかなり古く、2010年のバージョンのWPFで機能するかどうかはわかりませんが、ネストされた型の「実際の」(内部)名前を使用して機能させることができます。

<local:A+B />

分解されたコードを見たことがあれば、ネストされた型は次のようになります。

ParentTypeName+Nested
43
Ludovic Chabant

.プロパティを参照します。 XAMLがネストされたクラスも検索できなかった理由はわかりませんが、検索できません。


ネストされたクラスcan表現される文字列内の場合(例:プロパティ値)、A+Bの代わりにA.Bを使用:

<Label SomeProperty1="{x:Static local:A+B.SomeProperty2}" />

要素名として(問題に示されているように)、+は許可されていません。これは、結果が有効なXMLではなくなるためです。 +は有効な名前文字ではありません:
XAMLはXMLです
XML仕様-NameChar

したがって、要素名はネストされたクラスを直接記述することはできません。
ただし、以下のUPDATEを参照してください。これを解決する代替構文です。


[〜#〜]更新[〜#〜]
1つの回答に対する@Artfunkelのコメントによると、これは解決策になるはずです[私はテストしていません]:

<x:Type TypeName="local:A+B"/>

差出人: https://docs.Microsoft.com/en-us/dotnet/framework/xaml-services/x-type-markup-extension

その構文でプロパティを指定する方法は未定です。 x:TypeArgumentsを使用しますか?

6
ToolmakerSteve