WPF:ContentControl的ContentTemplate始终为null

时间:2017-11-23 18:14:38

标签: c# wpf datatemplate

我在一个主窗口的资源部分有一个ContentControl绑定到一个X类实例和一个DataTemplate for X.

<Window x:Class="DT1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DT1"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:X}">
            <TextBlock Text="Hello, World!"/>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <Button Content="Press me" Click="Button_Click" HorizontalAlignment="Left" VerticalAlignment="Top"/>
            <ContentControl x:Name="cont" Background="Pink" Content="{Binding MyX}" Tag="Blobby"/>
        </StackPanel>
    </Grid>
</Window>

在后面的MainWindow代码中的按钮单击处理程序中,我有一个处理程序,它尝试访问ContentControl的ContentTemplate,但它始终为null:

using System.Windows;

namespace DT1
{
    public class X
    {
    }

    public partial class MainWindow : Window
    {
        public X MyX { get; set; } = new X();
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var template = cont.ContentTemplate;
            System.Diagnostics.Debug.WriteLine($"ContentTemplate: {template?.ToString() ?? "template is null"}");
        }
    }
}

访问DataTemplate for X中的可视项目的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

它是null,因为您没有设置任何datatemplate 显式。当您定义数据模板而不提供 x:key 并使用 x:Type 提供数据类型时,您正在使用它所谓的隐式数据表 STRONG>。

为了从代码隐藏中获取datatemplate,您必须明确指定它:

<Window.Resources>
    <DataTemplate DataType="{x:Type local:X}" x:Key="XTemplate">
        <TextBlock Text="Hello, World!"/>
    </DataTemplate>
</Window.Resources>
<Grid>
    <StackPanel>
        <Button Content="Press me" Click="Button_Click" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <ContentControl x:Name="cont" Background="Pink" Content="{Binding MyX}" Tag="Blobby" ContentTemplate="{StaticResource XTemplate}"/>
    </StackPanel>
</Grid>

希望这有帮助!