2010-11-24 2 views
1

Предположим, у меня есть несколько UserControl вроде:Как получить доступ к объекту xaml в коде для индивидуального пользовательского контроля?

Uc1, UC2

UC2 включают uc1 в XAML как

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

затем в новом UserControl коде позади, я хочу, чтобы создать экземпляр UC2 и uc1 доступ как:

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

я получил ошибку, потому что myuc1 не доступен в коде позади, но я могу получить доступ к myuc1 в UC2 кода Бех инд! Не знаю, почему.

сообщение об ошибке говорит: UC2 не содержит определение для «myuc1»

, как решить эту проблему?

ответ

0

Разве вы не должны обращаться к myuc1 переменной, а не к типам?

Например:

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

спасибо. Я набрал ошибку в сообщении. должен быть mycontrol.myuc1.DataContext = myViewModel; Я получил ошибку с неопределенной ошибкой. – KentZhou 2010-11-24 19:06:05

+0

В этом случае я не смог воспроизвести проблему. Я создал быстрое приложение, как вы прописали, и я смог добраться до myuc1. – Jason 2010-11-24 19:40:56

0

Это причина UC2 включает uc1. Итак, myuc1 доступен в uc2 interanlly, потому что он будет скомпилирован как частное поле. Если вы действительно хотите сделать этот экземпляр общедоступным - создайте свойство в uc2. .

uc1 MyUC1 общественности {получить {возвращение myuc1}}

+0

Это может быть так. Пока я пытался воспроизвести его, все было в одной и той же сборке, поэтому внутренне видимо. – Jason 2010-11-24 20:09:13

0

Единственная причина, я могу думать о том, почему ваш код не будет работать, потому что ваш новый UserControl в другом проекте от ваших элементов управления uc1 и uc2. Поля, представляющие именованные элементы управления, имеют внутреннюю доступность и, следовательно, недоступны для других проектов.

На мой взгляд, не делать эти поля частными не является хорошим выбором, и на самом деле динамическое создание полей вообще не очень хорошо. Мне кажется, что мне нравятся образцы VB6/VBA.

Я бы порекомендовал вас добавить соответствующие свойства и методы к uc2, которые будут манипулировать uc1, а не разрешать внешнему коду напрямую работать с uc1.

Если по какой-либо причине вы не можете принять такой подход, рассмотрите возможность размещения оберточного доступа к элементу управления в публичном свойстве. Также подумайте о создании интерфейса, который может реализовывать uc1, содержащий все методы и свойства, к которым вы хотите получить доступ, чтобы это публичное свойство вернуло этот интерфейс, а не тип uc1.

Смежные вопросы