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

时间:2012-10-15 16:19:38

标签: wpf xaml triggers

我创建了一个辅助类来托管自定义依赖项属性。我创建了一个有点复杂的自定义UserControl对象,并且经常更新它的布局。我想在其中一个附加属性更改其值时触发动画。

以下是托管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>

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

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

我试图让一个RoutedEvent告诉我IsMenuReversed的变化,但后来意识到我无法检查xaml中DP的当前值(据我所知)。

1 个答案:

答案 0 :(得分:0)

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

这是带有DP的Helper类,可以触发两个不同的路由事件之一:

    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>

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