Получение ссылки на объект по имени из DataTemplate

#silverlight #silverlight-4.0

#silverlight #silverlight-4.0

Вопрос:

Если у меня есть следующий XAML:

<инструментарий: высота формы данных="100" x:Name="форма">
 <инструментарий:DataForm.EditTemplate>
 <DataTemplate>
 <Имя стековой панели="stack"></StackPanel>
 </DataTemplate>
 </toolkit:DataForm.EditTemplate>
 </toolkit:DataForm>

Я могу получить ссылку на «форму» с помощью этого.Найдите имя («форма») из представления.

Как я могу получить ссылку на «стек»? FindName возвращает значение null.

Ответ №1:

Проблема здесь в том, что содержимое xaml DataTemplate принадлежит к области имен, отличной от внешнего Xaml. При вызове FindName элемента выполняется поиск только в области имен, в которой элемент был изначально сгенерирован. Следовательно, вызов FindName на UserControl не найдет элементы, сгенерированные DataTemplate . Причина этого в том, что DataTemplate (и другие шаблоны) предназначены для многократного повторного использования, использование NameScope устраняет неоднозначность имен.

Решение состоит в том, чтобы вызвать справку VisualTreeHelper , взгляните на код в этом блоге, чтобы узнать мое мнение о VisualTreeHelper . С VisualTreeEnumeration классом из этого блога, добавленным в ваш проект, вы можете сделать это:-

 var element = this.Descendents().OfType<FrameworkElement>().FirstOrDefault(fe => fe.Name == "stack");
  

Конечно, если вы знаете, что «стек» — это StackPanel тогда вы можете уточнить с .OfType<T> .