我有一个使用带TabControl的表单的silverlight应用程序。
我想将一个TabItem GotFocus事件绑定到我的ViewModel。但是,当我执行以下操作时,我会收到错误。
<controls:TabControl>
<controls.TabItem GotFocus="{Binding Model.MyGotFocusCommand}">
我可以将TabControl事件绑定到我的ViewModel吗?
答案 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>
最后但并非最不重要的是,我经常发现只需在后面的代码中捕获事件就可以接受,然后将其路由到我的视图模型中。如果您可以忍受这些缺点(主要是可测试性的损失),那么这种方法很简单直接。