【问题标题】:Change ContentTemplate of Contentpresenter through Templatebinding通过 Templatebinding 改变 Contentpresenter 的 ContentTemplate
【发布时间】:2014-06-24 13:38:42
【问题描述】:

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

<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>

【问题讨论】:

    标签: c# wpf controltemplate contentpresenter templatebinding


    【解决方案1】:

    TemplateBinding 似乎无法与自定义控件上的自定义属性一起正常工作。您可以尝试将RelativeSource Binding 用于TemplatedParent 属性:

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

    您可以从 MSDN 上的TemplatedParent property 页面了解更多信息。

    【讨论】:

    • 问题是我想在触发器内设置 ContentTemplate。但我想我可能已经找到了一个可行的解决方案。很快就会在这里更新
    • 哦,好吧,我很惊讶。您的解决方案也适用于触发器。谢谢=)
    • 为什么会令人惊讶?一个有效的Binding.Path 就是一个有效的Binding.Path,不管它是在哪里定义的。
    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多