我正在尝试在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>
为什么会这样?
答案 0 :(得分:0)
正如在该问题的评论中所提到的,使用MVVM和更改后面代码中的控件是一个坏主意。
您的行为应该定义一个布尔附加属性,让我们称之为IsInEditMode
。然后,不是直接设置模板,而是将附加属性的值设置为true
。在您的样式/模板中添加触发器以更改模板(或设置模板部分的可见性),具体取决于IsInEditMode
的值。
这样您就可以对所有属性组合做出反应(IsInEditMode && TestProperty
; IsInEditMode && !TestProperty
;等等......)
此外,您还可以在其他控件上使用该行为。