在DataTemplate中定义XAML为null的VisualTree
-
23-09-2019 - |
题
我使用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 方式。