在代码中更改模板后,样式中的触发模板不起作用

时间:2013-10-02 16:23:34

标签: c# wpf triggers styles controltemplate

我正在尝试在Style中切换Button的ControlTemplate

<Style TargetType="Button">
      <Style.Triggers>
          <DataTrigger Binding="{Binding Path=TestProperty}" Value="true">
                <Setter Property="Template" Value="{StaticResource MyCustomTemplate}"/>
           </DataTrigger>
       </Style.Triggers>
</Style>

在我在代码中更改按钮的模板之前,它工作正常。例如,

myButton.Template = someTemplate;

即使这样也应该重现一个错误:

myButton.Template = myButton.Template;

顺便说一句,以下代码会将myButton foregound正确更改为Aqua。这意味着触发器工作正常。它只是无法设置模板

<Style TargetType="Button">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=TestProperty}" Value="true">
            <Setter Property="Template" Value="{StaticResource MyCustomTemplate}"/>
            <Setter Property="Foreground" Value="Aqua"></Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

为什么会这样?

1 个答案:

答案 0 :(得分:0)

正如在该问题的评论中所提到的,使用MVVM和更改后面代码中的控件是一个坏主意。

您的行为应该定义一个布尔附加属性,让我们称之为IsInEditMode。然后,不是直接设置模板,而是将附加属性的值设置为true。在您的样式/模板中添加触发器以更改模板(或设置模板部分的可见性),具体取决于IsInEditMode的值。

这样您就可以对所有属性组合做出反应(IsInEditMode && TestProperty; IsInEditMode && !TestProperty;等等......)

此外,您还可以在其他控件上使用该行为。