为什么我不能将DataTrigger添加到控件的Triggers集合中?

Tan*_*Tan 15 wpf datatrigger

为什么我不能像这样编码

<Border Width="130" Height="70">
    <Border.Triggers>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="0">
            <Setter Property="Style" Value="{StaticResource ResourceKey=ListBoxItemBorder}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="200">
            <Setter Property="Style" Value="{StaticResource ResourceKey=ListBoxItemBorderInactive}"/>
        </DataTrigger>
    </Border.Triggers>
</Border>
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

Failed object initialization (ISupportInitialize.EndInit). 
Triggers collection members must be of type EventTrigger.  
Error at object '4_T' in markup file
Run Code Online (Sandbox Code Playgroud)

我做错了什么错误的帮助.

Sco*_*ott 31

安倍是正确的,并很好地解释了这些局限性.您可能想要考虑的一件事是:

而不是有两种边框样式,并试图根据触发器在它们之间进行选择......

在边框上使用单一样式,此样式的设置器代表您的"正常"外观.这个样式还包含你的DataTrigger,你的DataTrigger有一组setter,它们基本上代表你的第二种风格(当这个触发器的评估结果为真时,它的优先级高于标准的setter!

编辑:

像这样的东西 -

<Style TargetType="Border" x:Key="BorderStyle">
    <!-- These setters are the same as your normal style when none of your triggers are true -->
    <Setter Property="BorderBrush" Value="Black" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="0">
            <!-- These setters are the same as your ListBoxItemBorder style -->
            <Setter Property="BorderBrush" Value="Green" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="200">
            <!-- These setters are the same as your ListBoxItemBorderInactive style -->
            <Setter Property="BorderBrush" Value="Gray" />
        </DataTrigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)


Abe*_*cht 18

不幸的是,只能EventTriggers直接应用于元素.如果你想使用一个Trigger或者DataTrigger,他们是在一个Style,ControlTemplateDataTemplate.

从资源名称来看,它看起来像是一个Border内部的ListBoxItem ControlTemplate.您可以轻松地将触发器移动到模板的触发器集合中.