2010-12-31 19 views
3

私は、ContentPropertyAttributeを使用してその子パネルの1つの子プロパティを公開するSilverlight UserControlを持っています。これは私が私のページ上のパネルに子コントロールを追加することができます:UserControl子コントロールとFindName

<local:MyUserControl> 
    <TextBox Name="tbTest" /> 
</local:MyUserControl> 

これは離れページの「tbTest」フィールドが存在することから、動作しますが、初期化されていません。詳細を見ると、InitializeComponentメソッドはTextBox(FindNameを含む)を検索しようとしますが、失敗します(nullを返します)。

いくつかの調査の後、私は名前スコープが問題であることを発見しました.UserControlは独自のネームスコープを持っています。したがって、子はページのFindNameではなく、UserControlのFindNameメソッドで見つけることができます。

私のUserControlを変更して、子コントロールをInitializeComponentメソッドで検索できるようにするにはどうすればよいですか?標準的なパネル(StackPanel、Gridなど)に問題はないようですので、解決策が必要ですか?

おかげ

答えて

1

この時点で行うことは難しいかもしれないが、最善の行動は、おそらくのItemsControlの代わりに、UserControlからあなたのコントロールを導き出すことであろう。名前スコープに問題はありません。

回避策として、VisualTreeHelperを使用してコントロールに潜入し、tbTestフィールドを手動で設定することができます。

+0

私はこれが必要であることに驚いていますが、私は試してみましょう。標準的なパネルを特別なものにすることで、この問題を回避することができますか?おそらく私はこれらのうちの1つから派生することができますか? – Barguast

+0

これらのパネルに特別なものは何もありません。特別なUserControlです。コンテナコントロールとして使用するようには設計されていませんが、ContentPropertyAttributeを使用して、それをちょっとした作業にする方法が見つかりました。クラスがパネルであればPanelから確かに派生することができますが、あなたが記述したものから、ItemsControlがより適切であるように思われますので、私はそれを提案しました。 – Josh