XAMLでネストされたクラスのインスタンスを作成します
-
28-09-2019 - |
質問
で xaml ファイル(wpf usercontrol)、参照する方法はありますか 内部クラス 別のクラス「A」で定義された「B」?
public class A
{
public class B
{
}
}
何かのようなもの :
<local:A.B ... />
「B」はクラス「A」の「B」という名前のプロパティとして解釈されるため、この構文は機能しません。
「::」または「+」のようなよりエキゾチックな構文を試しましたが、何も機能しないようです。
私は現在使用しています シルバーライト4 と vs2010.
よろしくお願いします。
解決
私は検索と検索をしていました。これが可能なら、私は知りたいからです。残念ながら、私はこれを見つけました MSDN:
カスタムクラスはネストされたクラスであってはなりません。ネストされたクラスとそれらの一般的なCLR使用の「ドット」構文は、添付のプロパティなどの他のWPFおよび/またはXAML機能を妨害します。
そのため、ネストされたクラスをDOT演算子で参照できないようです。 XAMLを通じてその内部クラスに到達する別の方法については、私はまだ検索で運がありませんでした。 :o(しかし、これはかなり興味深い問題なので、私は検索を続けます。たぶん私は運を見つけます!:o)
他のヒント
この質問はかなり古く、2010年にWPFのバージョンで機能したかどうかはわかりませんが、ネストされたタイプの「実際の」(内部)名前を使用して機能させることができます。
<local:A+B />
分解されたコードを見たことがあるなら、それがネストされたタイプのように見えます。
ParentTypeName+Nested
.
を指します 財産; Xamlがネストされたクラスを検索できなかった理由はわかりませんが、そうではありません。
ネストされたクラス できる 表現されます 文字列の中に (例:プロパティ値)、使用 A+B
それ以外の A.B
:
<Label SomeProperty1="{x:Static local:A+B.SomeProperty2}" />
要素名として (問題に示されているように)、 +
結果はもはや有効ではないため、許可されていません。 +
有効な名前の文字ではありません:
XAMLはXMLです.
XML Spec -Namechar.
そのため、要素名はネストされたクラスを直接記述することはできません。
ただし、以下の更新を参照してください - これを解決する代替構文。
アップデート
@artfunkelの1つの答えに関するコメントに従って、これは解決策である必要があります[私はテストしていません]:
<x:Type TypeName="local:A+B"/>
から: https://docs.microsoft.com/en-us/dotnet/framework/xaml-services/x-type-markup-extion
TBD指定方法 プロパティ その構文で。使用する x:TypeArguments
?