2008-10-29 6 views
52

J'ai une zone de liste, et je donne les résultats suivants ItemTemplate pour elle:WPF Trigger pour IsSelected dans un DataTemplate pour les articles ListBox

<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> 

Comme vous pouvez le voir le ContentControl a mis à visibilité effondrés.

J'ai besoin de définir un déclencheur qui provoque la visibilité à être réglé sur « Visible »

lorsque le ListItem est sélectionné, mais je ne peux pas comprendre.

Des idées? MISE À JOUR: Bien sûr, je pourrais simplement dupliquer le DataTemplate et ajouter des triggers au ListBox en question pour utiliser l'un ou l'autre, mais je veux éviter de dupliquer ce code.

Répondre

98

Vous pouvez définir le style de votre ContentControl de telle sorte qu'un feu de déclenchement lorsque son conteneur (le ListBoxItem) devient sélectionné:

<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> 

Sinon, je pense que vous pouvez ajouter le déclencheur au modèle lui-même et font référence au contrôle par nom . Je ne sais pas cette technique assez bien pour taper de la mémoire et d'assumer ça va marcher, mais il est quelque chose comme ceci:

<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

Mec! Merci beaucoup! Je n'avais pas ce problème, mais le FindAncestor m'a aidé à résoudre une grande douleur que je m'étais cogné la tête pendant 2 heures! Merci encore. Jason –

+1

Qu'est-ce que designerContent ??? J'essaie de définir l'arrière-plan de la listbox sélectionnée (j'utilise un datatemplate en ligne). Je veux, que lorsque l'utilisateur sélectionne un élément, son arrière-plan ne devrait pas devenir bleu, mais devrait avoir la même couleur que non sélectionné. – Shimmy

+0

Je voulais juste ajouter que DataTrigger Binding dans le second exemple m'a beaucoup aidé. Merci! – NigelTufnel

3

@ Matt, Merci !!! Il suffit d'ajouter un déclencheur pour IsSelected == false, et maintenant il fonctionne comme un charme!

<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> 

+2

Vous ne devriez pas avoir un déclencheur séparé pour le cas "Faux". Cela est géré par le Scepteur de visibilité en dehors de la collection Triggers. –

+0

Odd, alors je dois encore faire quelque chose de mal – TimothyP

+8

Spécifiez simplement une valeur par défaut sur la cible elle-même, et utilisez le déclencheur pour spécifier la valeur alternative. –

Questions connexes