首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不能将DataTrigger添加到控件的Triggers集合中?

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

Stack Overflow用户
提问于 2010-08-26 22:37:39
回答 3查看 39.7K关注 0票数 17

为什么我不能这样写代码呢?

代码语言:javascript
运行
复制
<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>

我得到了这个错误

代码语言:javascript
运行
复制
Failed object initialization (ISupportInitialize.EndInit). 
Triggers collection members must be of type EventTrigger.  
Error at object '4_T' in markup file

我做错了什么?请帮帮我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-27 00:59:15

Abe是正确的,并很好地解释了这些限制。您可能需要考虑的一件事是:

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

在你的边框上使用一个单一的样式,这个样式的setter代表你的“正常”外观。此样式还包含您的DataTrigger,并且您的DataTrigger有一个setter集合,这些setter实际上代表您的第二个样式(当此触发器的计算结果为真时,这些setter的优先级高于标准setter!

编辑:

像这样的东西-

代码语言:javascript
运行
复制
<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>
票数 33
EN

Stack Overflow用户

发布于 2010-08-26 22:52:31

不幸的是,只有EventTriggers可以直接应用于元素。如果要使用TriggerDataTrigger,它们必须在StyleControlTemplateDataTemplate中。

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

票数 20
EN

Stack Overflow用户

发布于 2018-05-12 19:54:09

这里有一种无限制触发器的方法。

示例:

代码语言:javascript
运行
复制
 <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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3576193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档