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

本文关键字:样式 不起作用 代码 | 更新日期: 2023-09-27 18:33:33

我正在尝试切换样式中的按钮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>

为什么会这样?

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

正如该问题的注释中所述,使用 MVVM 并在代码隐藏中更改控件是一个坏主意。

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

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

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