2008-10-29 11 views
52

que tiene un cuadro de lista, y he ItemTemplate siguiendo para ello:WPF disparo para IsSelected en un DataTemplate para los artículos 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> 

Como se puede ver la ContentControl ha puesto a Visibilidad colapsado.

necesito para definir un disparador que hace que la visibilidad que se establece en "visible"

cuando se selecciona el ListItem, pero no puedo entenderlo.

¿Alguna idea?

ACTUALIZACIÓN: Por supuesto, podría simplemente duplicar el DataTemplate y agregar disparadores al ListBox en cuestión para usar uno u otro, pero quiero evitar la duplicación de este código.

Respuesta

98

Puede estilo de su ContentControl tal que un desencadenador se activa cuando queda seleccionado su contenedor (el 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> 

Por otra parte, creo que se puede añadir el gatillo para la propia plantilla y la referencia al control por su nombre . No sé esta técnica lo suficientemente bien como para escribir de la memoria y asumir que va a trabajar, pero es algo como esto:

<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

Amigo! Muchas gracias! No estaba teniendo este problema, pero FindAncestor me ayudó a resolver un gran dolor. ¡Me había estado golpeando la cabeza durante 2 horas! Gracias de nuevo. Jason –

+1

¿Qué es designerContent ??? Estoy tratando de establecer el fondo del cuadro de lista seleccionado (utilizo una plantilla de datos en línea). Quiero que, cuando el usuario selecciona un elemento, su fondo no se vuelva azul, pero debe tener el mismo color que no seleccionado. – Shimmy

+0

Solo quería agregar que la unión DataTrigger en el segundo ejemplo me ayudó mucho. ¡Gracias! – NigelTufnel

3

@ Matt, gracias !!!

Solo tenía que agregar un activador para IsSelected == false también, ¡y ahora funciona a las mil maravillas!

<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

No debería tener que tener un activador separado para el caso "Falso". Eso es manejado por el Organizador de Visibilidad fuera de la colección Triggers. –

+0

Impar, entonces todavía debo estar haciendo algo mal – TimothyP

+8

Simplemente especifique un valor como valor predeterminado en el destino en sí, y use el desencadenador para especificar el valor alternativo. –

Cuestiones relacionadas