Получение ссылки на объект по имени из DataTemplate - PullRequest
3 голосов
/ 26 мая 2011

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

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

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

1 Ответ

4 голосов
/ 26 мая 2011

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

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

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

Конечно, если вы знаете, что "стек" - это StackPanel, то вы можете получить более конкретную информацию с помощью .OfType<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...