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(); 
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top