问题描述
我有一个列表框,并且它具有以下ItemTemplate:
I have a listbox, and I have the following ItemTemplate for it:
<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的可见性"设置为折叠".
As you can see the ContentControl has Visibility set to collapsed.
我需要定义一个将可见性"设置为可见"的触发器
I need to define a trigger that causes the Visibility to be set to "Visible"
当选择列表项,但我不能弄清楚.
when the ListItem is selected, but I can't figure it out.
有什么想法吗?
更新:当然,我可以简单地复制DataTemplate并添加触发器到有问题的列表框以使用其中一个,但我想避免重复此代码.
UPDATE: Of course I could simply duplicate the DataTemplate and add triggersto the ListBox in question to use either one or the other, but I want to prevent duplicating this code.
推荐答案
您可以设置ContentControl的样式,以便在选择其容器(ListBoxItem)时触发触发器:
You can style your ContentControl such that a trigger fires when its container (the ListBoxItem) becomes selected:
<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>
或者,我认为您可以将触发器添加到模板本身,并按名称引用控件.我不太了解这种技术,无法从内存中键入它并认为它会起作用,但这是这样的:
Alternatively, I think you can add the trigger to the template itself and reference the control by name. I don't know this technique well enough to type it from memory and assume it'll work, but it's something like this:
<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>
这篇关于用于ListBox项目的DataTemplate中的IsSelected的WPF触发器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!