在WPF中有一種簡單的方法將VisualState綁定到枚舉值嗎?有點像DataStateBehavior,但對於一個枚舉?DataStateBehavior for Enum而不是bool?串?
6
A
回答
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>
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();
}
}
相關問題
- 1. 保持BOOL而不是bool
- 2. php bool函數返回字符串而不是bool
- 3. enum bool的衝突類型?
- 4. boost :: bimap for enum
- 5. 檢查BOOL正在檢查,而不是
- 6. 爲什麼clock :: is_steady會返回const bool而不是bool?
- 7. Set in enum for C#
- 8. 如何映射IDictionary <Enum, bool>?
- 9. ASP.NET Repeater - Eval()for bool?
- 10. for each而不是for循環
- 11. Django:FOO_set.all()for filter()而不是get()
- 12. foreach而不是FOR IN R
- 13. atof()for float而不是double
- 14. ,是否存在`int`的`parse` for`bool`?
- 15. 爲什麼UIControlState是一個Struct而不是Enum?
- 16. 爲什麼DataStateBehavior最初不會更新?
- 17. Silverlight的DataStateBehavior,不使用初始值
- 18. 爲什麼我的DataStateBehavior不起作用
- 19. Get&Set for Enum in C++
- 20. 將字符串轉換爲Enum而不知道它是C類型的#
- 21. 使用void *而不是bool是一個可取的做法嗎?
- 22. Enum不是一個constexpr?
- 23. jQuery FullCalendar:更改allDay條件以檢查字符串而不是bool
- 24. DB返回字符串而不是int(mysqlnd for PHP-7.1/Laravel)
- 25. For循環返回一個字符串而不是對象
- 26. 帶DataStateBehavior和MVVM綁定的StackOverflow
- 27. 如何使用apply而不是for for string for stringMatch函數?
- 28. Matlab,使用索引而不是嵌套For循環(for for)
- 29. 檢查Enum是否包含字符串?
- 30. 是(bool | bool)安全嗎?
我想你可以離開了覆蓋......,基本上這將甚至不需要成爲一個行爲 – 2011-02-26 02:08:48
@Markus爲你是正確的覆蓋。至於行爲 - 我想這可能是一個附加屬性,但這種方式是 - (A)從混合使用,和(B)可以執行要在FrameworkElement的只放。 – 2011-02-26 02:13:37
很好用,謝謝! – thumbmunkeys 2012-04-04 22:33:05