我相信以前有人问过这个问题,但是我没有很容易地弄清楚如何表达这个查询。
我有这个款式;
<SolidColorBrush x:Key="SemiTransparentRedBrushKey">#F0FF0000</SolidColorBrush>
<Style x:Key="TextBoxEmptyError" TargetType="{x:Type TextBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text.Length}" Value="0">
<Setter Property="BorderBrush" Value="{StaticResource ResourceKey=SemiTransparentRedBrushKey}"/>
</DataTrigger>
</Style.Triggers>
</Style>
我可以应用到文本框有一个红色的边框,当他们是空的。很好,我可以把Style="{StaticResource TextBoxEmptyError}"
添加到Control标签。但是,如果我想对触发器应用这种样式,以便控件仅在某些条件下使用它(例如绑定为真),该怎么办?比如:
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=ApprovedRequired}" Value="True">
<Setter Property="Style" Value="{StaticResource TextBoxEmptyError}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
这段代码通过{"Style object is not allowed to affect the Style property of the object to which it applies."}
抛出一个异常这样的事情可以做到吗?
Edit:如果样式触发器不能这样做,因为它会覆盖自己,是否有另一种方法来有条件地应用资源样式?
编辑:如果有更合适的术语,我可以更改问题标题
样式不能从Style中的Setter设置,因为这样第一个样式根本就不存在。
既然你正在寻找一个验证风格,我建议看看Validation.ErrorTemplate
,虽然如果这不起作用,你可以改变你的触发器,所以它修改特定的属性,如BorderBrush而不是style属性
我会考虑使用模板与TemplateTrigger,在那里你可以改变任何你喜欢基于任何条件的样式