2010-06-14 29 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

我想你可以離開了覆蓋......,基本上這將甚至不需要成爲一個行爲 – 2011-02-26 02:08:48

+0

@Markus爲你是正確的覆蓋。至於行爲 - 我想這可能是一個附加屬性,但這種方式是 - (A)從混合使用,和(B)可以執行要在FrameworkElement的只放。 – 2011-02-26 02:13:37

+0

很好用,謝謝! – thumbmunkeys 2012-04-04 22:33:05

1

有一個DataStateSwitchBehavior SL可以移植到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

您可以在純xaml中使用每個可能的枚舉值使用DataTrigger,每個觸發器使用不同的狀態調用GoToStateAction。看下面的例子。欲瞭解更多詳情,請看 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 2012-02-10 19:17:42

0

我遇到了上述EnumStateBehavior答案的問題。

的的PropertyChanged處理程序將首先觸發時的AssociatedObject爲空(因爲結合已經建立,但行爲尚未連接還)。此外,即使首次附加行爲,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(); 
    } 
}