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

时间:2010-08-26 14:37:39

标签: 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>

我收到此错误

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

我在做什么错误的帮助。

3 个答案:

答案 0 :(得分:31)

安倍是正确的并且很好地解释了这些限制。您可能想要考虑的一件事是:

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

在边框上使用单一样式,此样式的设置器代表您的“正常”外观。 这个样式还包含你的DataTrigger,你的DataTrigger有一组setter,它们基本上代表你的第二种风格(当这个触发器评估为true时,它比标准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>

答案 1 :(得分:18)

不幸的是,只有EventTriggers可以直接应用于元素。如果您想使用TriggerDataTrigger,则必须使用StyleControlTemplateDataTemplate

从资源名称看,这似乎是Border ListBoxItem内的ControlTemplate。您可以轻松地将触发器移动到模板的触发器集合中。

答案 2 :(得分:0)

这是一种无限制触发的方式。

示例:

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

链接Sample

链接组件Github