WPF在控件上同时设置DataTemplate和ControlTemplate不起作用。

4

显然我在这里缺少非常基础的东西。我找到了类似的问题,但从答案中没有一个能让我理解我做错了什么。

当我设置ControlTemplate时,我的DataTemplate没有被拾取。

我创建了一个非常简单的示例来说明我的问题:

<Window x:Class="WpfTesterProject.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfTesterProject"
        Title="Window1" Height="300" Width="300">

    <Window.Resources>
        <DataTemplate DataType="{x:Type local:Person}">
            <StackPanel>
                <TextBlock Text="{Binding FirstName}" />
                <TextBlock Text="{Binding LastName}" />
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

    <ContentControl Content="{Binding Content}">
        <ContentControl.Template>
            <ControlTemplate>
                <Border BorderBrush="Blue" BorderThickness="2">
                    <ContentPresenter />
                </Border>
            </ControlTemplate>
        </ContentControl.Template>
    </ContentControl>
</Window>

我想要做的是在运行时选择用户定义的数据模板,同时我还想例如将每个单独的元素都包裹在边框中,不论用户模板是什么,甚至如果他没有指定任何模板。

从我阅读类似问题的文章得知,我必须在ControlTemplate中使用,但结果与删除它相同 - 只显示边框。

你能展示一下后台代码吗?Window 的数据上下文是什么? - Bas
不要在后台放置代码。DataContext 是 new { Content=any_object_possible } - Markos
1个回答

6

我复制了你的应用程序。看起来问题在于ControlTemplateTargetType属性:

<ContentControl Content="{Binding}">
    <ContentControl.Template>
        <ControlTemplate TargetType="ContentControl">
            <Border BorderBrush="Blue" BorderThickness="2">
                <ContentPresenter />
            </Border>
        </ControlTemplate>
    </ContentControl.Template>
</ContentControl>

哦,就这样?难怪我在类似的问题中找不到解决方案。没有人会问那么愚蠢的问题。谢谢 :-) - Markos
1
设置属性并不是非常明显 ;) - Bas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接