我在 .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/