2008-10-29 13 views
52

Ich habe eine Listbox, und ich habe die folgende ItemTemplate für sie:WPF Auslöser für IsSelected in einem Datatemplate für ListBox Artikel

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

Wie Sie die Content Sichtbarkeit gesetzt sehen zu kollabiert.

Ich brauche einen Trigger zu definieren, die die Sichtbarkeit bewirkt auf „sichtbar“ gesetzt

wenn die ListItem ausgewählt ist, aber ich kann es nicht herausgefunden.

Irgendwelche Ideen?

UPDATE: Natürlich könnte ich einfach die DataTemplate duplizieren und Triggers an die betreffende ListBox hinzufügen, um entweder das eine oder das andere zu verwenden, aber ich möchte verhindern, diesen Code zu duplizieren.

Antwort

98

Sie Ihren Content stylen können, so dass ein Trigger ausgelöst wird, wenn sein Behälter (die ListBoxItem) ausgewählt wird:

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

Alternativ denke ich Ihnen den Auslöser zur Vorlage hinzufügen können selbst und die Steuerung durch Namen verweisen . Ich weiß nicht, diese Technik gut genug, um sie aus dem Speicher zu schreiben und davon ausgehen, es wird funktionieren, aber es ist so etwas wie diese:

<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

Typ! Ich danke dir sehr! Ich hatte dieses Problem nicht, aber der FindAncestor half mir, einen großen Schmerz zu lösen, den ich mir 2 Stunden lang in den Kopf geschlagen hatte! Danke nochmal. Jason –

+1

Was ist DesignerContent ??? Ich versuche, den ausgewählten listboxitem Hintergrund (ich verwende eine Inline-Datatemplate). Ich möchte, dass, wenn der Benutzer ein Element auswählt, sein Hintergrund nicht blau werden sollte, sondern die gleiche Farbe wie nicht ausgewählt haben sollte. – Shimmy

+0

Ich wollte nur hinzufügen, dass die DataTrigger-Bindung im zweiten Beispiel mir sehr geholfen hat. Vielen Dank! – NigelTufnel

3

@ Matt, danke !!!

Ich musste nur noch einen Trigger für IsSelected == false hinzufügen, und jetzt funktioniert es wie ein 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

Sie sollten keinen separaten Trigger für den "False" -Fall haben müssen. Dies wird vom Sichtbarkeits-Setter außerhalb der Triggers-Sammlung gehandhabt. –

+0

Odd, dann muss ich immer noch etwas falsch machen – TimothyP

+8

Geben Sie einfach einen Wert als Standard für das Ziel selbst, und verwenden Sie den Trigger, um den alternativen Wert anzugeben. –