如何将TabItem GotFocus绑定到ViewModel命令

时间:2017-07-17 19:59:19

标签: c# silverlight mvvm

我有一个使用带TabControl的表单的silverlight应用程序。

我想将一个TabItem GotFocus事件绑定到我的ViewModel。但是,当我执行以下操作时,我会收到错误。

<controls:TabControl>
  <controls.TabItem GotFocus="{Binding Model.MyGotFocusCommand}">

我可以将TabControl事件绑定到我的ViewModel吗?

1 个答案:

答案 0 :(得分:2)

您无法将事件直接绑定到命令。在事件上调用命令需要使用Expression Blend交互触发器。

添加对Microsoft.Expression.Interactions.dll和System.Windows.Interactivity.dll程序集的引用。

在视图中声明交互性和交互名称空间前缀:

的xmlns:ⅰ= “http://schemas.microsoft.com/expression/2010/interactivity” 的xmlns:EI = “http://schemas.microsoft.com/expression/2010/interactions”

<i:Interaction.Triggers>
              <i:EventTrigger EventName="GotFocus">
                    <i:InvokeCommandAction
Command="{Binding GotFocusCommand}"/>
             </i:EventTrigger>
        </i:Interaction.Triggers>

如果您不喜欢使用Expression Blend,您可以使用允许通过行为进行绑定的框架(例如MVVM Light)。这通过EventToCommand类作为行为公开,允许您将事件绑定到命令。这样,在引发事件时,就像调用事件处理程序一样调用bound命令。

<i:Interaction.Triggers>
    <i:EventTrigger EventName="GotFocus">
        <cmd:EventToCommand Command="{Binding Mode=OneWay,Path=GotFocusCommand}"
                            PassEventArgsToCommand="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>

最后但并非最不重要的是,我经常发现只需在后面的代码中捕获事件就可以接受,然后将其路由到我的视图模型中。如果您可以忍受这些缺点(主要是可测试性的损失),那么这种方法很简单直接。