通过Templatebinding更改Contentpresenter的ContentTemplate

时间:2014-06-24 13:38:42

标签: c# wpf controltemplate contentpresenter templatebinding

是否可以做这样的事情(见下面的代码)?我尝试了不同的方法,但没有一个工作。这是TemplateBinding的限制吗?我不想通过Staticressources设置ContentTemplates(这可以),因为Control应该在运行时更改模板。我怎样才能做到这一点?

<ControlTemplate x:Key="myControlTemplate" TargetType="{x:Type controls:mycontrol}">
<Grid x:Name="root" Margin="{TemplateBinding Margin}" >
    <ContentPresenter Opacity="0" x:Name="Content" ContentTemplate="{TemplateBinding MinimizedContentTemplate}">
</Grid>
<ControlTemplate.Triggers>
    <Trigger Property="ControlState" Value="Maximized">
        <Setter TargetName="Content" Property="ContentTemplate" Value="{TemplateBinding MaximizedContentTemplate}"/>
    </Trigger>
</ControlTemplate.Triggers>

<Style TargetType="{x:Type controls:mycontrol}">
    <Setter Property="ControlState" Value="Minimized" />
    <Setter Property="MaximizedContentTemplate" Value="{StaticResource DefaultMaxContentTemplate}" />
    <Setter Property="MinimizedContentTemplate" Value="{StaticResource DefaultMinContentTemplate}" />
    <Setter Property="Template" Value="{StaticResource myControlTemplate}" />
</Style>

1 个答案:

答案 0 :(得分:2)

TemplateBinding似乎无法正常使用自定义控件上的自定义属性。您可以尝试使用RelativeSource Binding代替TemplatedParent属性:

<ContentPresenter Opacity="0" x:Name="Content" ContentTemplate="{Binding 
    MinimizedContentTemplate, RelativeSource={RelativeSource TemplatedParent}}">

您可以在MSDN上的TemplatedParent property页面上找到更多信息。