Дочерние элементы управления UserControl и FindName

У меня есть Silverlight UserControl, который использует ContentPropertyAttribute для предоставления свойства Children одной из его дочерних панелей. Это позволяет мне добавлять дочерние элементы управления на панель на моей странице:

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

Это работает, кроме поля tbTest на странице, которое присутствует, но не инициализировано. При ближайшем рассмотрении метод InitializeComponent пытается найти TextBox (с FindName), но не может этого сделать (возвращается null).

После некоторого расследования я обнаружил, что проблема в области видимости имен - у UserControl есть собственная область видимости имен, поэтому дочерние элементы не могут быть обнаружены с помощью FindName страницы, но могут быть обнаружены с помощью метода FindName UserControl.

Как я могу изменить свой UserControl, чтобы дочерние элементы управления можно было найти с помощью метода InitializeComponent? Стандартные панели (StackPanel, Grid и т. Д.), Похоже, не имеют при этом никаких проблем, так что должно быть решение?

Спасибо


person Barguast    schedule 31.12.2010    source источник


Ответы (1)


На данном этапе это может быть сложно сделать, но, вероятно, лучше всего будет получить управление от ItemsControl, а не от UserControl. Тогда у вас не было бы проблем с областями имен.

Я полагаю, что в качестве обходного пути вы могли бы погрузиться в элемент управления с помощью VisualTreeHelper, чтобы вручную установить поле tbTest.

person Josh    schedule 31.12.2010
comment
Я удивлен, что это необходимо, но я попробую. Что делает стандартные панели настолько особенными, что они решают эту проблему? Может быть, я смогу извлечь из одного из них? - person Barguast; 31.12.2010
comment
В этих панелях нет ничего особенного, особенным является UserControl. Он не предназначен для использования в качестве элемента управления контейнера, но вы нашли способ заставить его работать, используя ContentPropertyAttribute. Вы, безусловно, могли бы унаследовать от Panel, если ваш класс является панелью, но из того, что вы описали, ItemsControl кажется более подходящим, поэтому я предложил это. - person Josh; 01.01.2011