【问题标题】:WPF Trigger for IsSelected in a DataTemplate for ListBox items列表框项目的 DataTemplate 中 IsSelected 的 WPF 触发器
【发布时间】:2010-09-19 21:33:07
【问题描述】:

我有一个列表框,并且我有以下 ItemTemplate:

<DataTemplate x:Key="ScenarioItemTemplate">
    <Border Margin="5,0,5,0"
            Background="#FF3C3B3B"
            BorderBrush="#FF797878"
            BorderThickness="2"
            CornerRadius="5">
        <DockPanel>
            <DockPanel DockPanel.Dock="Top"
                       Margin="0,2,0,0">
                <Button HorizontalAlignment="Left"
                        DockPanel.Dock="Left"
                        FontWeight="Heavy"
                        Foreground="White" />
                <Label Content="{Binding Path=Name}"
                       DockPanel.Dock="Left"
                       FontWeight="Heavy"
                       Foreground="white" />
                <Label HorizontalAlignment="Right"
                       Background="#FF3C3B3B"
                       Content="X"
                       DockPanel.Dock="Left"
                       FontWeight="Heavy"
                       Foreground="White" />
            </DockPanel>
            <ContentControl Name="designerContent"
                            Visibility="Collapsed"
                            MinHeight="100"
                            Margin="2,0,2,2"
                            Content="{Binding Path=DesignerInstance}"
                            Background="#FF999898">
            </ContentControl>
        </DockPanel>
    </Border>
</DataTemplate>

如您所见,ContentControl 已将 Visibility 设置为折叠。

我需要定义一个触发器,将可见性设置为“可见”

当 ListItem 被选中时,但我想不通。

有什么想法吗?

更新:当然我可以简单地复制 DataTemplate 并添加触发器 到有问题的 ListBox 以使用其中一个或另一个,但我想防止重复此代码。

【问题讨论】:

    标签: wpf triggers listbox itemtemplate event-triggers


    【解决方案1】:

    您可以设置 ContentControl 的样式,以便在其容器(ListBoxItem)被选中时触发触发器:

    <ContentControl 
        x:Name="designerContent"
        MinHeight="100"
        Margin="2,0,2,2"
        Content="{Binding Path=DesignerInstance}"
        Background="#FF999898">
        <ContentControl.Style>
            <Style TargetType="{x:Type ContentControl}">
                <Setter Property="Visibility" Value="Collapsed"/>
                <Style.Triggers>
                    <DataTrigger
                            Binding="{Binding
                                RelativeSource={RelativeSource
                                    Mode=FindAncestor,
                                    AncestorType={x:Type ListBoxItem}},
                                    Path=IsSelected}"
                            Value="True">
                        <Setter Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
    </ContentControl>
    

    另外,我认为您可以将触发器添加到模板本身并按名称引用控件。我不太了解这种技术,无法从内存中输入它并假设它会起作用,但它是这样的:

    <DataTemplate x:Key="ScenarioItemTemplate">
        <DataTemplate.Triggers>
            <DataTrigger
                    Binding="{Binding
                        RelativeSource={RelativeSource
                            Mode=FindAncestor,
                            AncestorType={x:Type ListBoxItem}},
                            Path=IsSelected}"
                    Value="True">
                <Setter
                    TargetName="designerContent"
                    Property="Visibility"
                    Value="Visible"/>
            </DataTrigger>
        </DataTemplate.Triggers>
    
        ...
    </DataTemplate>
    

    【讨论】:

    • 老兄!太感谢了!我没有遇到这个问题,但 FindAncestor 帮助我解决了我头疼了 2 个小时的大痛!再次感谢。杰森
    • 设计师内容是什么???我正在尝试设置所选列表框的背景(我使用内联数据模板)。我想要,当用户选择一个项目时,它的背景不应该变成蓝色,而应该与未选择的颜色相同。
    • 只是想补充一点,第二个示例中的 DataTrigger 绑定对我有很大帮助。谢谢!
    • DataTemplate.Triggers 示例非常有用!谢谢!专业提示:您必须在 元素之前声明“TargetName=”引用的控件。
    • 正如我所读到的,使用“FindAncestor”是一种不好的做法,因为它会在每次可以进行更直接的连接时运行搜索。 (目前我无法为您命名更好的解决方案)
    【解决方案2】:

    @Matt,谢谢!!!

    只需要为 IsSelected == false 添加一个触发器, 现在它就像一个魅力!

    <ContentControl.Style>
    <Style TargetType="{x:Type ContentControl}">
        <Setter Property="Visibility" Value="Collapsed"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True">
                <Setter Property="Visibility" Value="Visible"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="False">
                <Setter Property="Visibility" Value="Collapsed"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    

    【讨论】:

    • 您不必为“假”案例设置单独的触发器。这是由 Triggers 集合之外的 Visibility Setter 处理的。
    • 只需在目标本身上指定一个值作为默认值,并使用触发器指定替代值。
    猜你喜欢
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多