2017-01-12 3 views
1

La demande est que la ligne de ma ListView clignote lorsque la propriété SelectedItem du ViewModel déclenche des modifications.UWP - Storyboard dans DataTemplate ControlStoryboardAction déclenche uniquement la première fois

Ceci est mon code, le problème est que cela ne fonctionne que la première fois. Les modifications ultérieures sont ignorées.

<DataTemplate x:Key="myDataTemplate"> 
    <Grid x:Name="myGrid"> 
     <Interactivity:Interaction.Behaviors> 
      <Core:DataTriggerBehavior Binding="{Binding SelectedItem}" Value="True"> 
       <Media:ControlStoryboardAction> 
        <Media:ControlStoryboardAction.Storyboard> 
         <Storyboard> 
          <ColorAnimation 
           To="#009ABF" 
           Storyboard.TargetName="myGrid" 
           Storyboard.TargetProperty="(Grid.Background).(SolidColorBrush.Color)" 
           AutoReverse="True" 
           Duration="0:0:1" 
           RepeatBehavior="1x" /> 
         </Storyboard> 
        </Media:ControlStoryboardAction.Storyboard> 
       </Media:ControlStoryboardAction> 
      </Core:DataTriggerBehavior> 
     </Interactivity:Interaction.Behaviors> 
     <TextBlock Text="{Binding Name}" 
      Grid.Column="1" 
      VerticalAlignment="Top" 
      HorizontalAlignment="Left" 
      Margin="0,2,10,0" 
      FontSize="16" 
      TextAlignment="Left"/> 

     <!--OMISSIS--> 
    </Grid> 

Code SelectedItem:

public bool SelectedItem 
    { 
     get 
     { 
      return this.selectedItem; 
     } 
     set 
     { 
      this.selectedItem = value; 
      this.RaisePropertyChanged(); 
     } 
    } 
+0

Qu'est-ce 'type SelectedItem' ?, s'il vous plaît, fournir le code cs –

+0

À première vue, il est juste votre' RepeatBehavior = « 1x » 'depuis qu'il utilise le même Storyboard pour chaque instance et vous avez' AutoReverse' fixé sur elle. –

Répondre

0

Ceci est la solution que j'ai trouvé.

1) Utilisation événement complet de la scénarimage

<Storyboard Completed="SelectedItemReset" FillBehavior="Stop"> 

3) Utiliser la GalaSoft.MvvmLight.Messaging.Messenger pour communiquer de CodeBehind et ViewModel la remise à zéro de la propriété SelectedItem

Xaml

<ListView> 
<ListView.ItemTemplate> 
    <DataTemplate> 
     <Grid x:Name="DataTemplateGrid"> 
      <Interactivity:Interaction.Behaviors> 
       <Core:DataTriggerBehavior Binding="{Binding SelectedItem}" ComparisonCondition="Equal" Value="True"> 
        <Media:ControlStoryboardAction ControlStoryboardOption="Play"> 
         <Media:ControlStoryboardAction.Storyboard> 
          <Storyboard Completed="SelectedItemReset" FillBehavior="Stop"> 
           <ColorAnimation 
            To="Lime" 
            Storyboard.TargetName="DataTemplateGrid" 
            Storyboard.TargetProperty="(Grid.Background).(SolidColorBrush.Color)" 
            Duration="0:0:1"/> 
          </Storyboard> 
         </Media:ControlStoryboardAction.Storyboard> 
        </Media:ControlStoryboardAction> 
       </Core:DataTriggerBehavior> 
      </Interactivity:Interaction.Behaviors> 

      <!--OMISSIS--> 

     </Grid> 
    </DataTemplate> 
</ListView.ItemTemplate> 

CodeBehind

private void SelectedItemReset(object sender, object e) 
{ 
GalaSoft.MvvmLight.Messaging.Messenger.Default.Send<Mvvm.ViewModels.Units.SelectedItemResetMessage>(new Mvvm.ViewModels.Units.SelectedItemResetMessage()); 
} 

MVVM Classe .ctor

public MyViewModel() 
{ 
    GalaSoft.MvvmLight.Messaging.Messenger.Default.Register<SelectedItemResetMessage>(this, message => 
    { 
     if (this.SelectedItem == true) 
      this.SelectedItem = false; 
    }); 
} 

Note: Mon DataTemplate était dans un fichier séparé et relié au ListView avec la propriété ItemTemplate, cela m'a empêché d'appeler la méthode Achevé en CodeBehind.