2010-03-03 6 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> 

Kompiliert nicht mit Fehler 'Kann das Triggerziel nicht finden' backgroundBrush '.'WPF DataTrigger kann Triggerziel nicht finden

Wenn ich den DataTrigger entferne, wird er kompiliert und funktioniert. Wenn ich den DataTrigger so ändere, dass er TargetName="grid" Property="Background" verwendet, wird er kompiliert und funktioniert (aber ohne die gewünschte Deckkraft).

Wohin gehe ich falsch?

+0

+1, gute Frage. Ich dachte, ich würde WPF verstehen, aber ich habe keine Ahnung, warum das nicht funktioniert ... – Heinzi

+0

(später Kommentar, aber doch ...) Sie ändern den Wert einer Farbe, wenn Sie eigentlich zwei verschiedene Farben haben sollen (definiert als lokale Ressourcen) und tausche dann zwischen ihnen in den Auslösern der Auslöser. Ich würde denken, dass dies die Ursache des Problems ist (obwohl es getestet werden sollte, um sicher zu sein). – heltonbiker

Antwort

4

Während ich nicht sicher bin, warum der Pinsel nicht im Namescope enthalten ist, können Sie dies tun, indem Sie den Pinsel auswechseln und in den Animationen wie folgt auf die Color-Eigenschaft des Hintergrundpinsels "dotting":

<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

Das hat funktioniert - Danke. backgroundBrush ist eigentlich im Bereich für den StoryBoard-Trigger und funktioniert ohne Änderung. Ich kann einfach nicht verstehen, warum dies für den DataTrigger nicht möglich wäre. – djskinner

+0

Ja, das konnte ich auch nicht herausfinden. Ich denke, es kann sein, dass der TargetName des Storyboards zur Laufzeit aufgelöst wird, während der TargetName des Settlers zur XAML-Parserzeit aufgelöst wird. –

+0

OP-Code änderte die Farbeigenschaft eines benannten Pinsels. Dieser Code ändert den Pinsel der Eigenschaft eines benannten Elements. Ich denke, das ist der Grund, warum dieser Code funktioniert, und OPs nicht. Eine bessere Übung wäre, beide Pinsel als (verschiedene) Ressourcen in der Datentabelle zu deklarieren und sie in den Setter zu referenzieren. – heltonbiker