2009-07-13 2 views
6

자주 발생하는 상황입니다.바운드 값이 변경 될 때 애니메이션을 시작하는 가장 좋은 방법은 무엇입니까?

보기에는 ViewModel 속성 (INotifyPropertyChanged에 의해 지원됨)에 연결된 컨트롤이 있습니다. 예 :

<TextBlock Text="{Binding Path=Subtotal}"/> 

속성이 변경되면 사용자에게 일부 창의적인 애니메이션으로 사용자의주의를 환기시켜야합니다. 뷰가 이미 알림에 연결되어 있으며 추가 코드를 많이 생성하지 않도록 (또는 적어도 한 번 만들고 다시 사용) 피할 수있는 방법을 활용할 수 있습니다. 아마도 데이터 트리거가 최선의 선택 일 수 있지만, 특정 값에 비해 어떤 값 변화에 대해서도 트리거하는 법을 모르겠습니다.

다음과 같은 옵션이 마음에 와서 :

  • 인상 뷰 모델에 추가 이벤트가 코드 숨김보기에 가입.
  • 값이 변경되면 true를 반환하는 변환기를 사용하여 언급 된 속성에 바인딩 된 datatrigger를 만듭니다.
  • 변경을 "알리는"데 사용되는 ViewModel의 새 부울 속성에 바인딩 된 datatrigger를 만듭니다.
  • 컨트롤의 종속성 속성 변경을 구독하고 애니메이션을 시작하는 컨트롤에 연결된 비헤이비어를 만듭니다.

어떤 것을 원하십니까/사용하십니까? 나는 어떤 선택을 놓쳤는가?

P. 솔루션이 애니메이션을 먼저 시작하고 종료 될 때 값 변경을 반영 할 수 있다면 좋을 것입니다 (그러나 중요하지는 않습니다).

답변

3

좋아,이게 내가 실험 한 후에 나온거야.

종속성 속성이있는 Expression Blend 3 트리거를 만들었습니다 (구독이라는 이름).

다음
public class DataTriggerPlus : TriggerBase<DependencyObject> 
{ 
    public static readonly DependencyProperty SubscriptionProperty = 
     DependencyProperty.Register("Subscription", 
      typeof(string), 
      typeof(DataTriggerPlus), 
      new FrameworkPropertyMetadata("", 
       new PropertyChangedCallback(OnSubscriptionChanged))); 

    public string Subscription 
    { 
     get { return (string)GetValue(SubscriptionProperty); } 
     set { SetValue(SubscriptionProperty, value); } 
    } 

    private static void OnSubscriptionChanged(DependencyObject d, 
     DependencyPropertyChangedEventArgs e) 
    { 
     ((DataTriggerPlus)d).InvokeActions(null); 
    } 
} 

은이 스토리 보드에 부착하는 방법은 다음과 같습니다 내 TextBlock의가 결합되어 동일한 값으로 구독 바인딩이 트리거가 Expression Blend를 여기에 3

에서 ControlStoryboardAction에 부착 된 트리거입니다 :

<TextBlock x:Name="textBlock" Text="{Binding TestProp}" Background="White"> 
    <i:Interaction.Triggers> 
     <local:DataTriggerPlus Subscription="{Binding TestProp}"> 
      <im:ControlStoryboardAction 
       Storyboard="{StaticResource Storyboard1}"/> 
     </local:DataTriggerPlus> 
    </i:Interaction.Triggers> 
</TextBlock> 

나는이 접근법을 많이 좋아한다.

편집 : 혼합과 대답 드류 코멘트 ...

네, 제공됩니다. Microsoft.Expression.Interactions.dll 및 System.Windows.Interactivity를 프로젝트에 포함하면됩니다.

그렇습니다. (누군가가 스타일 in this question을 통해 행동을 적용하는 좋은 방법을 찾았는지 물어 보았지만) 융통성의 이점도 있습니다. 예를 들어 스토리 보드를 시작할 수있을뿐만 아니라 같은 트리거에서 상태를 전환하거나 다른 작업을 수행 할 수도 있습니다.

+1

' '는 어디에서 왔습니까? Blend와 함께 배송되는 것 같습니다. 비 혼합 사용자가 사용할 수 있습니까? 내 코드에서 똑같은 것을 달성하고 싶지만, 내가 필요로하는 그러한 많은 인스턴스가있을 때 솔루션이 덜 장황하다. 스타일을 통해 가능할 수도 있습니다 ... –

2

애니메이션을 시작할 트리거를 만들 수 있습니다. 이 같은

뭔가 : 애니메이션이 완료되면 값을 설정하는 문제에 대한 문제에 관해서는

<Style> 
    <Style.Triggers> 
     <Trigger 
      Property="ViewModelProperty" 
      Value="True"> 
      <Trigger.EnterActions> 
       <BeginStoryboard Storyboard="YourStoryBoard" /> 
      </Trigger.EnterActions> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

,이 고통의 비트입니다. 스토리 보드에서 완료된 이벤트를 사용해야한다는 것을 알고있는 한, MVVM을 사용하지 않으려는 코드 숨김이 필요합니다.

완료된 이벤트에 바인딩하기 위해 EventTriggers를 사용해 보았지만 몇 가지 문제가 있습니다. 자세한 내용은 here을 참조하십시오.

+0

다시 말해서, 속성이 부울 또는 선택 집합이 아니라 임의의 문자열 또는 숫자이면? –

+0

그런 다음 ValueConverter를 사용합니다. ValueConverter와 동일한 솔루션 –

+0

각 개별 바인딩에 대해 값 변환기를 만들지 않는 한 값 변환기에서 값이 변경된 것을 어떻게 알 수 있습니까? –

관련 문제