Как получить логическое дерево DataTemplate - PullRequest
1 голос
/ 13 июля 2010

Есть ли возможность доступа к логическому дереву DataTemplate .

<DataTemplate x:Key="Test_DataTemplate">
    <Grid >        
        <TextBlock>Test</TextBlock>        
    </Grid>            
</DataTemplate>

В приведенном выше примере, если я получу DataTemplate с помощью FindResource("Test_DataTemplate"), можно ли получить доступ к дереву, например, получить элемент управления TextBlock.

Обратите внимание: Я не хочу получать доступ к визуальному дереву элемента управления , который использует этот шаблон данных. Я хочу получить доступ к дереву самих DataTemplate.

1 Ответ

2 голосов
/ 13 июля 2010

DataTemplate имеет свойство VisualTree, которое позволяет вам обращаться к фабричным объектам, использованным для создания объекта при применении шаблона, вы не можете получить доступ к фактическому TextBox в вашем примере, потому что он не существует, пока шаблон не будет применен.

Обновление:

Когда вы строите DataTemplate в коде, вы делаете это с помощью свойства VisualTree, свойство VisualTree содержит данные, необходимые для построения визуального дерева, когда шаблонused.

Свойство VisualTree не ссылается на фактическое визуальное дерево шаблона (к которому обращается VisualTreeHelper), поскольку шаблон не имеет фактического визуального дерева - только информация, необходимая для его построения.

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

Небольшое тестирование показывает, что при загрузкешаблон из XAML свойство VisualTree имеет значение null и thФактическое содержимое шаблона хранится в другом месте, это «в другом месте» является объектом TemplateContent, и у этого объекта нет открытых членов, которые вы можете использовать.

Итак, для доступа к содержимому шаблона, определенного в XAML, вынеобходимо использовать метод LoadContent шаблона для фактического создания объектов, определенных в шаблоне, а затем использовать VisualTreeHelper или LogicalTreeHelper для исследования созданных объектов.

(вы можете использовать отражения для просмотра объекта TemplateContent - но это означает, что выполагаются на недокументированные внутренние детали реализации, которые вы не полностью понимаете и можете менять между версиями - поэтому я бы не рекомендовал это)

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