构建支持我自己的自定义事件的EventTriggerBehavior

时间:2013-12-30 18:20:27

标签: c# wpf xaml mvvm windows-runtime

我使用自己的自定义事件构建了自己的UserControl(我使用自己的自定义事件),在父项目中我希望将这些事件与命令一起使用,因为它是 MVVM < / strong>应用程序,全部使用Behaviors SDK (XAML) for Visual Studio 2013,如下所示:

<mediaPlayerControl:PlayerControl>
            <interactivity:Interaction.Behaviors>
                <core:EventTriggerBehavior EventName="ForwardClicked">
                    <core:InvokeCommandAction Command="{Binding OnForwardClicked, Mode=TwoWay}"/>
                </core:EventTriggerBehavior>
            </interactivity:Interaction.Behaviors>
</mediaPlayerControl:PlayerControl>

问题是EventTriggerBehavior只支持一些特定事件here,因此我在事件中使用的命令不会触发,现在,我想要做的是,构建行为,提供相同的体验,并支持我自己的事件:我希望它们看起来像这样:

<mediaPlayerControl:PlayerControl>
            <interactivity:Interaction.Behaviors>
                <core:ExtensionsEventTriggerBehavior EventName="ForwardClicked">
                    <core:ExtensionsInvokeCommandAction Command="{Binding OnForwardClicked, Mode=TwoWay}"/>
                </core:EventTriggerBehavior>
            </interactivity:Interaction.Behaviors>
</mediaPlayerControl:PlayerControl>

我已经阅读了很多关于实现此类行为的文章,但我无法清楚地告诉我,因为这是我第一次以这种方式处理它们,我想如果你告诉我该怎么做。

1 个答案:

答案 0 :(得分:0)

首先,你通常不会在UserControls XAML页面中添加行为,你会在XAML页面上添加使用UserControl的行为,所以我认为你需要这样的东西:

您只需添加EventHandler类型的公开活动,例如&#34; ForwardButtonClicked&#34;您的UserControl的Codebehind:

public event EventHandler ForwardButtonClicked;

然后,您还必须添加EventHandler方法,以便在视图上单击按钮时触发事件。所以你要在usercontrol的构造函数中添加一个eventhandler方法:

public PlayerControl()
{
  this.InitializeComponent();
  _forwardButton.Click += this.ForwardButtonClickedEventHandler;
}

Eventhandler看起来像:

private void ForwardButtonClickedEventHandler(object sender, RoutedEventArgs eventArgs)
{
  if(this.ForwardButtonClicked != null)
  {
    this.ForwardButtonClicked.Invoke(sender, new EventArgs());
  } 
}

然后,您可以将UserControl添加到XAML页面,并为UserControl的ForwardButtonClicked事件添加EventTriggerBehavior。 由于WinRT中不支持Custom RoutedEvents,因此您可能使用默认单击的RoutedEventHandler而不是普通的C#EventHandler,因为您没有事件的冒泡和隧道。但我不知道这是否有效,我没有尝试,因为我还不需要泡泡或隧道。 如果有人有更好的解决方案,我将非常感谢阅读它。