DataTemplate имеет свойство VisualTree, которое позволяет вам обращаться к фабричным объектам, использованным для создания объекта при применении шаблона, вы не можете получить доступ к фактическому TextBox в вашем примере, потому что он не существует, пока шаблон не будет применен.
Обновление:
Когда вы строите DataTemplate в коде, вы делаете это с помощью свойства VisualTree, свойство VisualTree содержит данные, необходимые для построения визуального дерева, когда шаблонused.
Свойство VisualTree не ссылается на фактическое визуальное дерево шаблона (к которому обращается VisualTreeHelper), поскольку шаблон не имеет фактического визуального дерева - только информация, необходимая для его построения.
И, кстати, просто чтобы сделать вещи немного более интересными, содержимое свойства VisualTree шаблона данных ближе к логическому дереву, чем к визуальному.
Небольшое тестирование показывает, что при загрузкешаблон из XAML свойство VisualTree имеет значение null и thФактическое содержимое шаблона хранится в другом месте, это «в другом месте» является объектом TemplateContent, и у этого объекта нет открытых членов, которые вы можете использовать.
Итак, для доступа к содержимому шаблона, определенного в XAML, вынеобходимо использовать метод LoadContent шаблона для фактического создания объектов, определенных в шаблоне, а затем использовать VisualTreeHelper или LogicalTreeHelper для исследования созданных объектов.
(вы можете использовать отражения для просмотра объекта TemplateContent - но это означает, что выполагаются на недокументированные внутренние детали реализации, которые вы не полностью понимаете и можете менять между версиями - поэтому я бы не рекомендовал это)