【问题标题】:Why can't I add a DataTrigger to my control's Triggers collection?为什么我不能将 DataTrigger 添加到我的控件的 Triggers 集合中?
【发布时间】:2011-04-04 07:43:12
【问题描述】:

为什么我不能这样编码

<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

我在做什么错请帮助。

【问题讨论】:

    标签: wpf datatrigger


    【解决方案1】:

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

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

    在边框上使用单一样式,此样式的设置器代表您的“正常”外观。 此样式还包含您的 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>
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        例子:

         <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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-18
          • 2014-05-19
          • 2011-01-30
          相关资源
          最近更新 更多