列表框项目的 DataTemplate 中 IsSelected 的 WPF 触发器
Posted
技术标签:
【中文标题】列表框项目的 DataTemplate 中 IsSelected 的 WPF 触发器【英文标题】:WPF Trigger for IsSelected in a DataTemplate for ListBox items 【发布时间】: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 以使用其中一个或另一个,但我想防止重复此代码。
【问题讨论】:
【参考方案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 示例非常有用!谢谢!专业提示:您必须在@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 处理的。 只需在目标本身上指定一个值作为默认值,并使用触发器指定替代值。以上是关于列表框项目的 DataTemplate 中 IsSelected 的 WPF 触发器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Silverlight 中使用 DataTemplate 显示单个项目?
如何将 ObservableCollection 绑定到 DataTemplate 中的文本框?