Czy istnieje prosty sposób w WPF do wiązania VisualStates do wyliczania wartości? Trochę jak DataStateBehavior, ale dla Enum?DataStateBehavior for Enum zamiast bool? Strunowy?
Odpowiedz
Najlepszym sposobem jest po prostu iść do przodu i wdrożyć Zachowanie że właśnie to robi -
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);
}
}
Użycie jest bardzo proste - wykorzystanie w następujący sposób:
<i:Interaction.Behaviors>
<local:EnumStateBehavior EnumProperty="{Binding MyEnumProperty}" />
</i:Interaction.Behaviors>
Jest DataStateSwitchBehavior w SL, które można przenieść do WPF: Anyone have a DataStateSwitchBehavior for WPF4?
Składnia jest dość prosta:
<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/>
Możesz to zrobić w czystym Xaml przy użyciu DataTriggera na każdą możliwą wartość wyliczenia przy każdym wywołaniu wyzwalacza GoToStateAction z innym stanem. Zobacz przykład poniżej. Aby uzyskać więcej informacji, zobacz 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>
To jest właśnie to, co zrobiłem dla większości rzeczy. – Firoso
Wystąpiły problemy z powyższą odpowiedzią EnumStateBehavior.
Obsługa właściwości PropertyChanged uruchamia się, gdy obiekt AssociatedObject ma wartość NULL (ponieważ powiązanie zostało skonfigurowane, ale zachowanie nie zostało jeszcze przyłączone). Ponadto, nawet jeśli zachowanie jest najpierw dołączone, docelowe elementy animacji VisualState mogą jeszcze nie istnieć, ponieważ zachowanie mogło zostać dołączone przed innymi potomnymi drzewami wizualnymi.
Rozwiązaniem było użycie zdarzenia Załadowano na powiązanym obiekcie, aby upewnić się, że ustawiono stan początkowy wiązania.
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. Algorytm strunowy
- 2. .NET: bool vs enum jako parametr metody
- 3. OptionParser zwracający bool zamiast argumentu?
- 4. Jak napisać ogólną pętlę for Java Enum?
- 5. Wyświetlacz Enum Opis w jqGrid zamiast wyliczenia
- 6. Dlaczego program Android Studio chce, żebym używał funkcji For Each zamiast For For Loop?
- 7. Zalety korzystania z boost :: mpl :: bool_ zamiast const bool
- 8. C++ bool zwraca 0 1 zamiast prawdziwej fałszu
- 9. Udowodnienie F (f BOOL) = bool
- 10. Cel-C: BOOL kontra bool
- 11. Enum in enum
- 12. Utwórz tablicę przyrostowych int, używając strumienia zamiast pętli for.
- 13. Homestead 502 Bad Gateway zamiast Whoops for PHP błędy
- 14. C++ niejawna konwersja do bool
- 15. typedef i enum lub enum class
- 16. Dlaczego dane Haskell Data.List.deleteBy przyjmuje funkcję porównania (a -> a -> Bool) i wartość zamiast predykatu (a -> Bool)?
- 17. Enum of Enum jest NULL
- 18. Łatwy C enum Pytanie
- 19. Rozszerzanie Enum w C#
- 20. Dlaczego gcc nie ostrzega, gdy wartość enum lub int jest przekazywana jako argument funkcji, który jest bool?
- 21. Kiedy należy używać BOOL i bool w C++?
- 22. Nie można niejawnie przekonwertować typu "bool" na "system.threading.tasks.task bool"
- 23. Niekompatybilność między bezpiecznym idiomem bool a jawnym bool operatora
- 24. Enum z metodami funkcjonalnymi (Combine Class/Enum)
- 25. Czy puste enum (enum {};) jest przenośne?
- 26. Różnica między klasą enum a enum?
- 27. Wyłączenie flagi enum
- 28. Wartość domyślna BOOL
- 29. Przeciążenie Bool/String Niejednoznaczność
- 30. Obsługa Bool Oracle SQL
myślę, że może opuścić nadpisanie ... iw zasadzie to nawet nie trzeba być zachowanie –
@Markus co do ręcznego masz rację. jeśli chodzi o zachowanie - myślę, że może to być dołączona właściwość, ale w ten sposób jest - (A) możliwa do wykorzystania z Blend, a (B) może być wymuszona, aby można ją było umieścić tylko w FrameworkElement. –
działa ładnie, dzięki! – thumbmunkeys