2010-03-03 8 views
5
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid x:Name="grid"> 
      <Grid.Background> 
       <SolidColorBrush x:Name="backgroundBrush" Color="Transparent" Opacity="0.1"/> 
      </Grid.Background> 
     </Grid> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding IsExpanded}" Value="True"> 
       <Setter TargetName="backgroundBrush" Property="Color" Value="Green" /> 
      </DataTrigger> 
      <Trigger SourceName="grid" Property="IsMouseOver" Value="True"> 
       <Trigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="backgroundBrush" 
           Storyboard.TargetProperty="Color" 
           To="White" Duration="0:0:1.5"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.EnterActions> 
       <Trigger.ExitActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="backgroundBrush" 
           Storyboard.TargetProperty="Color" 
           AccelerationRatio="1" Duration="0:0:1.5" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.ExitActions> 
      </Trigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

No se compila con el error 'No se puede encontrar el desencadenador target' backgroundBrush '.'WPF DataTrigger no puede encontrar Trigger Target

Si elimino el DataTrigger se compilará y funcionará. Si cambio el DataTrigger para usar TargetName="grid" Property="Background", se compilará y funcionará (pero sin la opacidad deseada).

¿Dónde me estoy equivocando?

+0

+1, buena pregunta. Pensé que entendía WPF, pero no tengo idea de por qué esto no funciona ... – Heinzi

+0

(último comentario, pero aún ...) Estás cambiando el valor de un color cuando en realidad deberías tener dos colores diferentes (definido como recursos locales) y luego intercambiarlos en los setters de los disparadores. Creo que esta es la causa del problema (aunque debe probarse para saberlo con certeza). – heltonbiker

Respuesta

4

Si bien no estoy seguro de por qué el pincel no está en el namescope, puede hacer esto cambiando el pincel, y "punteando hacia abajo" a la propiedad Color del pincel de fondo en las animaciones como sigue:

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid x:Name="grid"> 
      <Grid.Background> 
       <SolidColorBrush Color="Transparent" Opacity="0.1"/> 
      </Grid.Background> 
     </Grid> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding IsExpanded}" Value="True"> 
       <Setter TargetName="grid" Property="Background"> 
        <Setter.Value> 
         <SolidColorBrush Color="Green" Opacity="0.1"/> 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 
      <Trigger SourceName="grid" Property="IsMouseOver" Value="True"> 
       <Trigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="grid" 
          Storyboard.TargetProperty="Background.Color" 
          To="White" Duration="0:0:1.5"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.EnterActions> 
       <Trigger.ExitActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="grid" 
          Storyboard.TargetProperty="Background.Color" 
          AccelerationRatio="1" Duration="0:0:1.5" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.ExitActions> 
      </Trigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

Eso funcionó - Gracias. backgroundBrush está realmente en el alcance para el disparador StoryBoard y funciona sin modificaciones. Simplemente no puedo entender por qué estaría fuera del alcance del DataTrigger. – djskinner

+0

Sí, tampoco pude entender eso. Creo que es posible que TargetName del Storyboard se resuelva en tiempo de ejecución, mientras que TargetName del Setter se resuelva en el tiempo de análisis XAML. –

+0

El código OP estaba cambiando la propiedad del color de un pincel con nombre. Este código está cambiando el pincel de la propiedad de un elemento nombrado. Supongo que es por eso que este código funciona, y OP no. Una mejor práctica sería declarar ambos pinceles como recursos (diferentes) en la plantilla de datos, y hacer referencia a ellos en los instaladores. – heltonbiker

Cuestiones relacionadas