样式触发器应用另一个样式



我相信以前有人问过这个问题,但是我没有很容易地弄清楚如何表达这个查询。

我有这个款式;

<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,在那里你可以改变任何你喜欢基于任何条件的样式

相关内容

最新更新