Datatemplate definido em xaml tem visualtree null
-
23-09-2019 - |
Pergunta
Estou usando o WPF com .NET 3.0.
Eu tenho um Datatemplate relativamente simples definido como o CellTemplate para uma GridView. Espero que a propriedade VisualTree do Datatemplate contenha uma estrutura de trabalho, mas a propriedade é nula quando tento acessá -la no evento GridViewColumnHeader.Click. Por que o visualtree é nulo? Eu preciso acessá -lo. Aqui está a definição da 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>
E aqui está o manipulador de eventos:
private void Header_Click(object sender, RoutedEventArgs e)
{
GridViewColumnHeader gvch = e.OriginalSource as GridViewColumnHeader;
// error! VisualTree is null!
//gvch.Column.CellTemplate.VisualTree.GetType();
}
Solução
Este é o comportamento conhecido e esperado. Não consigo encontrar um MSDN ou outra citação "autoritativa" agora, mas Este fóruns MSDN posta explica (mais ou menos!):
A propriedade FrameworkTemplate.VisualTree ... é usada principalmente quando você cria programaticamente Datatemplate/ControlTplate no código, ao definir Datatemplate/ControlTemplate usando XAML, esta propriedade será nula, porque O WPF usa outro mecanismo para instanciar e construir modelos gerados por XAML. (enfase adicionada)
Portanto, a propriedade VisualTree não é preenchida quando um modelo é carregado do XAML: ela é preenchida apenas se você construir o modelo no código usando o estrutura do ReframeMelementFactory.
Para obter o conteúdo de um modelo definido no XAML, Call FrameworkTemplate.LoadContent (). Isso materializará uma instância do modelo e fornecerá o elemento raiz - você pode perfurar conforme necessário e definir propriedades ou ligações. Cabe a você colocar a instância materializada na janela contendo ou na árvore visual do controle, então você provavelmente desejará encapsular isso!
Outras dicas
A razão por trás da árvore visual sendo nula é porque a propriedade visual da árvore está mais próxima de Árvore lógica ao invés de Visual. O conteúdo real do modelo é armazenado em TemplateContent objeto que não tem membros públicos, você terá que usar LoadContent método.