c# - XAML 中定义的 DataTemplate 具有 null VisualTree

标签 c# wpf datatemplate visual-tree celltemplate

我在 .NET 3.0 中使用 WPF。

我有一个相对简单的 DataTemplate 定义为 GridView 的 CellTemplate。我希望 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 或其他“权威”引用,但是 this MSDN forums post解释(有点!):

FrameworkTemplate.VisualTree property ... is mainly used when you programmatically create DataTemplate/ControlTemplate in code, When defining DataTemplate/ControlTemplate using XAML, this property will be null, because WPF uses another mechanism to instantiate and construct XAML generated templates. (emphasis added)

因此,当从 XAML 加载模板时,不会填充 VisualTree 属性:仅当您使用 FrameworkElementFactory 在代码中构造模板时才会填充它。

要获取在 XAML 中定义的模板的内容,请调用 FrameworkTemplate.LoadContent()。这将实现模板的一个实例并为您提供根元素——然后您可以根据需要深入了解并设置属性或绑定(bind)。不过,将物化实例放入包含窗口或控件的可视化树中取决于您,因此您可能希望封装它!

关于c# - XAML 中定义的 DataTemplate 具有 null VisualTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2548663/

相关文章:

c# - 将多个构造函数与 Mvvm light 和 ViewModelLocator 一起使用时出现异常

asp.net - 始终显示 FooterTemplate,即使没有数据

wpf - 单独的 ResourceDictionary 中的 DataTemplate

c# - 自定义 TabItem 数据模板

c# - 生成串联的 SMS UDH 并将其添加到消息文本中

c# - 关闭连接/MySqlDataReader 不起作用

c# - 将 xaml 模板绑定(bind)转换为代码隐藏

c# - 将分配的值从非托管代码返回到托管代码

c# - 使屏幕阅读器可以访问 WPF 应用程序

c# - 如何从文件位置添加图像 WPF