Дъщерни контроли UserControl и FindName

Имам Silverlight UserControl, който използва ContentPropertyAttribute, за да разкрие свойството Children на един от неговите дъщерни панели. Това ми позволява да добавя дъщерни контроли към панела на моята страница:

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

Това работи, освен че полето 'tbTest' на страницата присъства, но не е инициализирано. При по-внимателна проверка методът InitializeComponent се опитва да намери TextBox (с FindName), но не успява да го направи (връща нула).

След известно разследване открих, че проблемите на имена са проблемът - 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