我使用WPF与.NET 3.0的

我有定义为CellTemplate为一个GridView一个相对简单的DataTemplate。我想到的DataTemplate的财产的VisualTree包含一个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 /控件模板使用   XAML,这个属性将是无效的,   因为<强> WPF使用另一种机制   实例化和构建XAML   生成的模板即可。 (着重   加)

因此,当一个模板从XAML加载的未填充的VisualTree属性:如果使用FrameworkElementFactory构造模板代码它只填充

要得到在XAML定义的模板的内容,调用FrameworkTemplate.LoadContent()。这将兑现的模板的实例,给你根元素 - 那么你就可以按照要求和设置属性或绑定钻。它是由你来插槽物化到例如包含窗口或控件的可视化树的,所以你可能会想封装这个!

其他提示

后面的视觉树被空的原因是因为视觉树特性是接近的逻辑树而不是<强>视觉一个即可。 模板的实际内容被存储在的 TemplateContent 不具有公共成员对象,你将不得不使用 LoadContent 方式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top