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

17

为什么我不能像这样编码

<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个回答

33

Abe说得很对,他清楚地解释了这个限制。你可能需要考虑的一个问题是:

不要使用两种边框样式,并尝试根据触发器来选择它们,而是在边框上使用单一样式,该样式的设置器代表您的“正常”外观。该样式还包含您的DataTrigger,您的DataTrigger具有一组设置器,它们基本上代表了您的第二种样式(当此触发器评估为true时,这些设置器的优先级高于标准设置器!)

编辑:

像这样的东西 -

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

20

很遗憾,只有EventTriggers可以直接应用于元素。如果要使用TriggerDataTrigger,它们必须在StyleControlTemplateDataTemplate中。

从资源名称来看,这是在ListBoxItemControlTemplate中的一个Border。您可以轻松地将触发器移动到模板的触发器集合中。


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>

链接 示例

链接组件 Github


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接