更改代码中的模板后,触发样式中的模板不起作用
本文关键字:样式 不起作用 代码 | 更新日期: 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
;等等...
此外,您还可以在其他控件上使用该行为。