Вопрос

Я использую WPF с .NET 3.0.

У меня есть относительно простая DataTemplate, определенная как CellTemplate для GridView.Я ожидаю, что свойство VisualTree DataTemplate от DataTemplate будет содержать FrameworkElementFactory , но это свойство равно нулю, когда я пытаюсь получить к нему доступ из события GridViewColumnHeader.Click .Почему VisualTree равно нулю?Мне нужно получить к нему доступ.Вот определение ListView:

<ListView ItemsSource="{Binding Stuff}" GridViewColumnHeader.Click="Header_Click">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="28">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Name="statusImage" Width="16" Height="16" Source="../Images/media_play_green_16x16.png"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

А вот и обработчик события:

private void Header_Click(object sender, RoutedEventArgs e)
{
    GridViewColumnHeader gvch = e.OriginalSource as GridViewColumnHeader;

    // error! VisualTree is null!
    //gvch.Column.CellTemplate.VisualTree.GetType(); 
}
Это было полезно?

Решение

Это известное и ожидаемое поведение.Я не могу найти MSDN или другую "авторитетную" цитату прямо сейчас, но это сообщение на форумах MSDN объясняет (вроде как!):

FrameworkTemplate.Свойство VisualTree. ...в основном используется при программном создании DataTemplate/ControlTemplate в коде, При определении DataTemplate / ControlTemplate с использованием XAML это свойство будет равно null, поскольку WPF использует другой механизм для создания экземпляра XAML сгенерированные шаблоны. (выделено мной добавлено)

Таким образом, свойство VisualTree не заполняется при загрузке шаблона из XAML:он заполняется только в том случае, если вы создаете шаблон в коде с использованием FrameworkElementFactory.

Чтобы получить содержимое шаблона, определенного в XAML, вызовите FrameworkTemplate.LoadContent() .Это материализует экземпляр шаблона и предоставит вам корневой элемент - затем вы можете выполнить детализацию по мере необходимости и установить свойства или привязки.Однако вам решать поместить материализованный экземпляр в содержащее окно или визуальное дерево элемента управления, поэтому вы, вероятно, захотите инкапсулировать это!

Другие советы

Причина, по которой значение Visual Tree равно null, заключается в том, что свойство Visual Tree ближе к Логическое Дерево вместо того , чтобы Визуальный Один.Фактическое содержимое шаблона хранится в Содержимое шаблона объект, у которого нет открытых элементов, вам придется использовать Загружаемый контент способ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top