2008-10-29 86 views
52

我有一个列表框,和我有以下的ItemTemplate它:WPF触发了IsSelected在ListBox中的项目一个DataTemplate

<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中已可见性设置为倒塌。

我需要定义导致能见度设置为

当选择列表项“可见”触发,但我不能弄明白。

任何想法?

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

回答

98

您可以风格你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> 
+1

好家伙!非常感谢!我没有遇到这个问题,但FindAncestor帮助我解决了一个让我头撞了2个小时的巨大痛苦! 再次感谢。 杰森 – 2009-07-26 15:27:51

+1

什么designerContent ??? 我想设置选定的listboxitem的背景(我使用内联数据模板)。 我想,当用户选择一个项目时,它的背景不应该变成蓝色,而应该与未选中的颜色相同。 – Shimmy 2009-08-27 16:57:49

3

@马特,谢谢!

刚把添加触发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> 

相关问题