2010-11-24 11 views
1

私のようないくつかのユーザーコントロールがあるとします。そして、後ろの新しいユーザーコントロールのコードでは、私はUC2のインスタンスを作成したいカスタマイズされたusercontrolのコードビハインドでxamlオブジェクトにアクセスするには?

UC1を、UC2

UC2が

<my:uc1 x:Name = "myuc1" /> 

のようにXAMLでUC1が含まれており、アクセスUC1のように:

uc2 mycontrol = new uc2(); 
uc2.myuc1.DataContext = myViewModel; 
.... 

myuc1が背後にあるコードでアクセスすることはできませんので、私はエラーを得たが、私はUC2コードBEHでmyuc1にアクセスすることができますインド!理由は分かりません。

エラーメッセージは言った: UC2は、この問題を解決する方法を「myuc1」

の定義が含まれていませんか?

答えて

0

変数のmyuc1ではなく型にアクセスするべきですか?例えば

:UC2はUC1を含ん原因

uc2 mycontrol = new uc2(); 
mycontrol.myuc1.DataContext = myViewModel; 
+0

ありがとうございます。私は投稿に間違いを入力しています。 mycontrol.myuc1.DataContext = myViewModelである必要があります。私は未定義のエラーでエラーが発生しました。 – KentZhou

+0

その場合、私は問題を再現できませんでした。あなたの綴り方を素早く作成し、myuc1にアクセスできました。 – Jason

0

です。ですから、myuc1は、私的なフィールドとしてコンパイルされるので、interc2でアクセス可能です。本当にこのインスタンスを公開するには、uc2のプロパティを作成してください。 など。

公共UC1 MyUC1 {取得{戻りmyuc1}}

+0

これが原因である可能性があります。私はそれを再現しようとしていましたが、すべてが同じアセンブリにあって内部的に見えました。 – Jason

+0

ここでの説明が間違っていますmyuc1が__internal__アクセシビリティがプライベートでないフィールドとしてクラスに追加されました。しかし、私はそれにアクセスするには、公共のアクセサリーのプロパティを使用すべきであることに同意するでしょう。 – AnthonyWJones

0

あなたの新しいユーザーコントロールが別のプロジェクト内にあるので、私はあなたのコードが動作しない理由を考えることができる唯一の理由は、あなたのuc1とuc2コントロールから。名前付きコントロールを表すフィールドには内部アクセシビリティがあるため、他のプロジェクトでは使用できません。

これらのフィールドをプライベートにしないことは良い選択ではなく、実際にフィールドを動的に作成することは良くありません。私には歴史的なVB6/VBAフォームがたくさんあります。

適切なプロパティとメソッドをuc2に追加することをお勧めします。これは、外部コードをuc1で直接操作するのではなく、uc1を操作します。

何らかの理由でこのアプローチをとることができない場合は、パブリックプロパティのコントロールにラッピングアクセスを配置することを検討してください。また、uc1が実装できるインタフェースを作成することを検討してください。このインタフェースは、アクセスするすべてのメソッドとプロパティを含み、このpublicプロパティがuc1タイプではなくそのインタフェースを返すようにします。

+0

あなたは正しいです。ありがとう。もっと簡単な解決策があります:この問題を解決するためにFieldModiferを使用してください。 – KentZhou