Как получить доступ к объекту XAML в коде позади для настраиваемого пользовательского контроля? - PullRequest
1 голос
/ 24 ноября 2010

Предположим, у меня есть несколько пользовательских элементов управления, таких как:

uc1, uc2

uc2 включает uc1 в xaml как

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

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

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

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

в сообщении об ошибке сказано: uc2 не содержит определения для 'myuc1'

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

Ответы [ 3 ]

0 голосов
/ 24 ноября 2010

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

public uc1 MyUC1 {get {return myuc1}}

0 голосов
/ 25 ноября 2010

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

По моему мнению, не делать эти поля закрытыми - не лучший выбор, и фактически динамическое создание полей вообще не являетсяхорошо.Попахивает мне историческими формами VB6 / VBA.

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

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

0 голосов
/ 24 ноября 2010

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

Например:

uc2 mycontrol = new uc2();
mycontrol.myuc1.DataContext = myViewModel;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...