用于在 XAML 中触发依赖项属性的 MVVM 方法



我创建了一个帮助程序类来托管自定义依赖项属性。 我创建了一个自定义的用户控件对象,该对象有些复杂,并且经常更新其布局。 我想在其中一个附加属性更改其值时触发动画。

下面是承载 DP 的帮助程序类的示例。

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

以下是我希望如何引用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>

意识到我无法执行上述代码,因为触发器集合只能容纳事件触发器。这就引出了我的问题:

这个问题的适当解决方案是什么?

试图制作一个路由事件来通知我 IsMenuReverse 的更改,但后来意识到我无法在 xaml 中检查 DP 的当前值(据我所知)。

到目前为止,我想出的是只有两个单独的路由事件。每个州一个。 我不是这个解决方案的忠实粉丝,所以我欢迎有人可能有的任何其他反馈。

下面是带有 DP 的帮助程序类,用于触发两个不同的路由事件之一:

    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)); 
      }
    }

下面是侦听路由事件并为每个事件触发相关情节提要的 Xaml:

<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>

如果您有替代解决方案,请发布:)

最新更新