样式触发器以应用其他样式

时间:2011-09-22 18:45:06

标签: wpf triggers styles

我确信之前已经问过这个问题,但我没有很容易想出如何对查询进行说明。

我有这种风格;

<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>

我可以应用于Textboxes,当它们为空时有一个红色边框。它很棒,我可以将Style="{StaticResource TextBoxEmptyError}"添加到控制标记中。但是如果我想用触发器应用这个样式,那么控件只能在某些条件下使用它(比如绑定是真的)?类似的东西:

<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."}

引发异常

可以这样做吗?

编辑:如果使用Style触发器无法完成此操作,因为它会覆盖自身,是否有其他方式可以有条理地应用资源样式?

编辑:如果此操作有更合适的术语,我可以更改问题标题。

2 个答案:

答案 0 :(得分:4)

无法从样式中的Setter设置样式,因为基本上第一个样式根本不会存在。

由于您正在寻找验证样式,我建议您查看Validation.ErrorTemplate,但如果这不起作用,您可以更改触发器,以便修改特定属性,例如BorderBrush而不是Style属性< / p>

答案 1 :(得分:0)

我会考虑使用带有TemplateTrigger的模板,你可以根据条件将样式更改为你想要的样式