2010-06-14 4 views

답변

4

가장 좋은 방법은 바로 가서 않는 행동을 구현하는 것입니다 단지 -

public class EnumStateBehavior : Behavior<FrameworkElement> 
{ 
    public object EnumProperty 
    { 
     get { return (object)GetValue(EnumPropertyProperty); } 
     set { SetValue(EnumPropertyProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for EnumProperty. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty EnumPropertyProperty = 
     DependencyProperty.Register("EnumProperty", typeof(object), typeof(EnumStateBehavior), new UIPropertyMetadata(null, EnumPropertyChanged)); 

    static void EnumPropertyChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (e.NewValue == null) return; 

     EnumStateBehavior eb = sender as EnumStateBehavior; 

     VisualStateManager.GoToElementState(eb.AssociatedObject, e.NewValue.ToString(), true); 
    } 

} 

사용법은 매우 간단합니다 - 사용 다음과 같이

<i:Interaction.Behaviors> 
     <local:EnumStateBehavior EnumProperty="{Binding MyEnumProperty}" /> 
</i:Interaction.Behaviors> 
+0

난 당신이 재정을 떠날 수 있다고 생각 ... 그리고 본질적으로 이것은 심지어 당신 말이 맞아 재정에 같은 행동 –

+0

@Markus을 할 필요가 없다. 이 동작은 첨부 된 속성 일 수 있습니다. 그러나이 방법은 (A) Blend에서 사용할 수 있으며 (B) FrameworkElement에만 적용되도록 적용 할 수 있습니다. –

+0

은 훌륭하게 작동합니다. 감사합니다. – thumbmunkeys

1

가있는 DataStateSwitchBehavior있다 WP는 WPF로 포팅 될 수 있습니다 : Anyone have a DataStateSwitchBehavior for WPF4?

구문은 매우 간단합니다 :

<is:DataStateSwitchBehavior Binding="{Binding Orientation}"> 
    <is:DataStateSwitchCase Value="Left" State="LeftState"/> 
    <is:DataStateSwitchCase Value="Right" State="RightState"/> 
    <is:DataStateSwitchCase Value="Down" State="DownState"/> 
    <is:DataStateSwitchCase Value="Up" State="UpState"/> 
<is:DataStateSwitchCase/> 
3

다른 상태로 GoToStateAction을 호출하는 각 트리거에서 가능한 열거 형 값당 DataTrigger를 사용하여 순수 xaml로 처리 할 수 ​​있습니다. 아래 예제를 참조하십시오. 자세한 내용은 Enum driving a Visual State change via the ViewModel을 참조하십시오.

<i:Interaction.Triggers> 
     <ei:DataTrigger Binding="{Binding ConfirmedAnswerStatus}" Value="Unanswered"> 
      <ei:GoToStateAction StateName="UnansweredState" UseTransitions="False" /> 
     </ei:DataTrigger> 
     <ei:DataTrigger Binding="{Binding ConfirmedAnswerStatus}" Value="Correct"> 
      <ei:GoToStateAction StateName="CorrectlyAnsweredState" UseTransitions="True" /> 
     </ei:DataTrigger> 
     <ei:DataTrigger Binding="{Binding ConfirmedAnswerStatus}" Value="Incorrect"> 
      <ei:GoToStateAction StateName="IncorrectlyAnsweredState" UseTransitions="True" /> 
     </ei:DataTrigger> 
    </i:Interaction.Triggers> 
+0

이것은 실제로 내가 대부분의 일을 처리하는 것을 끝내 었습니다. – Firoso

0

위의 EnumStateBehavior 답변에 문제가 있습니다.

PropertyChanged 처리기는 AssociatedObject가 null 인 경우 (바인딩이 설정되었으므로 Behavior가 아직 첨부되지 않았으므로) 처음 트리거됩니다. 또한 비헤이비어가 처음 첨부되면 VisualState 애니메이션의 대상 요소가 아직 존재하지 않을 수 있습니다. 비헤이비어가 다른 자식 비주얼 트리보다 먼저 첨부되었을 수 있기 때문입니다.

해결 방법은 연결된 개체의 Loaded 이벤트를 사용하여 바인딩의 초기 상태를 설정하는 것입니다.

public class EnumStateBehavior : Behavior<FrameworkElement> 
{ 
    public static readonly DependencyProperty BindingProperty = 
     DependencyProperty.Register(nameof(Binding), typeof(object), typeof(EnumStateBehavior), new UIPropertyMetadata(null, BindingPropertyChanged)); 

    public object Binding 
    { 
     get { return (object)GetValue(BindingProperty); } 
     set { SetValue(BindingProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     this.AssociatedObject.Loaded += AssociatedObject_Loaded; 
    } 

    protected override void OnDetaching() 
    { 
     this.AssociatedObject.Loaded -= AssociatedObject_Loaded; 
     base.OnDetaching(); 
    } 

    private void AssociatedObject_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (Binding != null) 
      GoToState(); 
    } 

    private void GoToState() 
    { 
     VisualStateManager.GoToElementState(this.AssociatedObject, Binding.ToString(), true); 
    } 

    private static void BindingPropertyChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     var eb = (EnumStateBehavior)sender; 

     if (e.NewValue == null || eb.AssociatedObject == null || !eb.AssociatedObject.IsLoaded) 
      return; 

     eb.GoToState(); 
    } 
} 
관련 문제