2009-03-09 3 views
3

저는 INotifyPropertyChanged를 구현하는 클래스 용 DataTemplate을 보유하고 있습니다. 재산이 바뀌고 스토리 보드가 다른 값으로 바뀌면 스토리 보드를 실행할 수 있습니까?속성에 WPF Storyboard 트리거가 변경되었습니다.

그리고 datatemplate이 만들어진 클래스의 값에 따라 시작시 스토리 보드를 트리거 할 수있는 방법이 있습니까?

답변

6

네, 그렇게 할 수 있습니다.

DataTrigger를 추가하고 해당 속성에 바인딩하십시오. 예를 들면 다음과 같습니다.

<DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding Path=MyProperty}" Value="True"> 
     <BeginStoryboard Storyboard="{StaticResource myStoryboard}"/> 
    </DataTrigger> 
</DataTemplate.Triggers> 

원하는 값으로 테스트 할 값을 설정할 수 있습니다. 따라서 스토리 보드를 설정하여 값이 false로 변경 될 때 시작할 수 있습니다. 원하는만큼 많은 DataTriggers (또는 다른 트리거)를 추가 할 수 있습니다.

예에서 더미 속성과 스토리 보드를 참조합니다.

속성이 변경되면 바인딩이 업데이트되고 데이터 바인딩으로 인해 트리거가 실행됩니다.

이 기술은 시작시에도 작동해야합니다.

+0

리스트 박스가 객체를 가져올 때 모든 값이 설정되면? – Peter

+1

물건을 구입하면 스토리 보드가 해고 될 것입니다. 그것을 시도하고 볼 수 있습니다. –

+2

어디 xaml에서 우리가 이것을 추가합니까? – swinefeaster

1

위의 포스터와 마찬가지로 DataTrigger를 사용하여 내 ViewModel의 속성에 바인딩했습니다. 혼란스러운 점은 데이터 트리거를 어디에 두어야하는지입니다. 루트 노드 (예 : Window)에 직접 넣습니다. Expression Blend를 사용하여 만든 태그 세부 정보를 처리했습니다. 또한

프로젝트에 대한 참조를 "Microsoft.Expression.Interactions"

XAML 포함해야합니다 (이 루트 노드에서 직접 이동)

<Window 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
    x:Name="window" > 

    ... 

    <i:Interaction.Triggers> 
     <ei:DataTrigger Binding="{Binding FlashingBackground, Mode=OneWay}" Value="ON"> 
     <ei:ControlStoryboardAction Storyboard="{StaticResource MyAnimation}"  
               ControlStoryboardOption="Play"/> 
     </ei:DataTrigger> 
    </i:Interaction.Triggers> 

    ... 
</Window> 

뷰 모델 :

private void TurnOnFlashingBackround() 
    { 
     FlashingBackground = "ON"; 
    } 

    private string _FlashingBackround = "OFF"; 

    public string FlashingBackground 
    { 
     get { return _FlashingBackround; } 

     private set 
     { 
      if (FlashingBackground == value) 
      { 
       return; 
      } 

      _FlashingBackround = value; 
      this.OnPropertyChanged("FlashingBackground"); 
     } 
    } 

    public new event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

마지막으로 ViewModel은 "INotifyPropertyChanged"에서 상속해야합니다.

+2

실제로이 예제는 블렌드 트리거를 사용합니다.이 블렌드 트리거는 내장 된 WPF 트리거와 매우 다릅니다. 그러나 그들은 같은 이름을지었습니다. 그냥 다른 네임 스페이스. 어떤면에서 Blend는 '부착 된'트리거로 간주 될 수 있지만 내재 된 요소는 배치 할 수있는 위치에 대한 매우 구체적인 규칙을 가지고 있습니다. –

+0

완전한 예제를 보여주는 플러스 원. – MickyD

관련 문제