Why can't I add a DataTrigger to my control's Triggers collection? Why can't I add a DataTrigger to my control's Triggers collection? wpf wpf

Why can't I add a DataTrigger to my control's Triggers collection?


Abe is correct and explains the limitations well. One thing you might want to consider is:

Instead of having two border styles, and trying to pick between them based on a trigger...

Use a single style on your border, this style's setters represent your 'normal' look.This style also contains your DataTrigger, and your DataTrigger has a collection of setters which essentially represents your second style (which have higher priority than the standard setters when this trigger evaluates to true!

Edit:

Something like this -

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


Unfortunately, only EventTriggers can be applied directly to elements. If you want to use a Trigger or DataTrigger, they have to be in a Style, ControlTemplate, or DataTemplate.

From the resource names, it looks like this is a Border inside a ListBoxItem ControlTemplate. You could easily move the triggers into the template's triggers collection.


Here is a way for no limitations triggers.

Example:

 <Border Width="130" Height="100" Grid.Row="1">        <ListBox x:Name="lstItems" ItemsSource="{Binding TestItems}">        </ListBox>        <tg:TriggerExtensions.Triggers>            <tg:TriggerCollections>                <tg:DataTriggerInfo Binding="{Binding CurrentStatus}" Value="0">                    <tg:DataTriggerInfo.Setters>                        <tg:SetterInfo ElementName="lstItems" Property="Style" Value="{StaticResource ListBoxRed}"/>                    </tg:DataTriggerInfo.Setters>                </tg:DataTriggerInfo>                <tg:DataTriggerInfo Binding="{Binding CurrentStatus}" Value="0" IsInvert="True">                    <tg:DataTriggerInfo.Setters>                        <tg:SetterInfo ElementName="lstItems" Property="Style" Value="{StaticResource ListBoxBlue}"/>                    </tg:DataTriggerInfo.Setters>                </tg:DataTriggerInfo>            </tg:TriggerCollections>        </tg:TriggerExtensions.Triggers>    </Border>

Link Sample

Link Component Github