/ / Podejście MVVM dla wyzwalaczy wyłącza właściwość zależności w XAML - wpf, xaml, wyzwalacze

Podejście MVVM dla wyzwalaczy wyłącza właściwość zależności w XAML - wpf, xaml, wyzwalacze

Stworzyłem klasę pomocniczą, aby hostować niestandardoweWłaściwości zależności. Stworzyłem niestandardowy obiekt UserControl, który jest dość skomplikowany i często aktualizuje jego układ. Chciałbym wywołać animację, gdy jedna z Załączonych właściwości zmieni jej wartość.

Oto przykład klasy pomocniczej, która obsługuje DP.

namespace testProject
{
public class MenuHelper : DependencyObject
{
public static readonly DependencyProperty IsMenuReversedProperty = DependencyProperty.RegisterAttached(
"IsMenuReversed",
typeof(Boolean),
typeof(MenuHelper),
new PropertyMetadata(false));
}
}

I oto przykład tego, jak chciałbym nawiązać do DP:

<UserControl.Triggers>
<Trigger Property="testProject:MenuHelper.IsMenuReversed" Value="True">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Bouncy_Bar" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="-1" Duration="0:0:.002"/>
</Storyboard>
</BeginStoryboard>
</Trigger>
<Trigger Property="testProject:MenuHelper.IsMenuReversed" Value="False">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Bouncy_Bar" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:.002"/>
</Storyboard>
</BeginStoryboard>
</Trigger>
</UserControl.Triggers>

Zdaję sobie sprawę, że nie mogę wykonać powyższego kodu, ponieważ kolekcja wyzwalaczy może zawierać tylko zdarzenia wyzwalające. Co prowadzi mnie do mojego pytania:

Jakie jest właściwe rozwiązanie tego problemu?

Próbowałem zrobić RoutedEvent, aby poinformować mnie o zmianie w IsMenuReversed, ale potem zrozumiałem, że nie mogę sprawdzić aktualnej wartości DP w Xaml (o ile wiem).

Odpowiedzi:

0 dla odpowiedzi № 1

Jak do tej pory doszedłem, mam tylko dwa oddzielne programy RoutedEvents. Jeden dla każdego stanu. Nie jestem wielkim fanem tego rozwiązania, więc przyjmuję wszelkie inne opinie, które ktoś może mieć.

Oto klasa Pomocników z DP, który uruchamia jedno z dwóch różnych zdarzeń routowanych:

    namespace TestProject
{
public class MenuHelper : DependencyObject
{
public static void SetIsMenuReversed(UIElement element, Boolean value)
{
if (GetIsMenuReversed(element) != value)
{
if (value == true)
element.RaiseEvent(new RoutedEventArgs(MenuHelper.MenuIsReversedEvent));
else
element.RaiseEvent(new RoutedEventArgs(MenuHelper.MenuIsNotReversedEvent));
element.SetValue(IsMenuReversedProperty, value);
}
}
public static bool GetIsMenuReversed(DependencyObject obj)
{
return (bool)obj.GetValue(IsMenuReversedProperty);
}

public static readonly RoutedEvent MenuIsReversedEvent = EventManager.RegisterRoutedEvent(
"MenuIsReversed",
RoutingStrategy.Direct,
typeof(RoutedEventHandler),
typeof(MenuHelper));

public static readonly RoutedEvent MenuIsNotReversedEvent = EventManager.RegisterRoutedEvent(
"MenuIsNotReversed",
RoutingStrategy.Direct,
typeof(RoutedEventHandler),
typeof(MenuHelper));
}
}

A oto Xaml, który nasłuchuje trasowanych wydarzeń i uruchamia odpowiedni storyboard dla każdego z nich:

<UserControl.Triggers>
<EventTrigger RoutedEvent="testProject:MenuHelper.MenuIsReversed">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Bouncy_Bar" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="-1" Duration="0:0:.002"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="testProject:MenuHelper.MenuIsNotReversed">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Bouncy_Bar" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:.002"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</UserControl.Triggers>

Opublikuj alternatywne rozwiązania, jeśli masz je :)