将带参数的命令附加到KeyUp事件

时间:2010-07-13 14:57:57

标签: c# wpf events mvvm command

我目前正在将一个中型WPF项目转换为MVVM,但我遇到了一个我无法解决的问题。也许你可以帮助我?

目标框架是.NET 3.5.1。

我有一个列表视图,它从底层视图模型中获取其项目。该视图模型正在公开命令以从列表视图中删除所选项。因此,command参数绑定到列表视图的SelectedItems属性。

<ListView ItemsSource="{Binding MyItems}"
          x:Name="MyListView"
          SelectionMode="Extended">
</ListView>
<Button x:Name="MyRemoveButton" 
        Content="Remove item" 
        Command="{Binding RemoveItemCommand}"
        CommandParameter="{Binding ElementName=MyListView, Path=SelectedItems}">

我的目的是不仅在按下按钮时执行此命令,而且在列表视图中触发KeyUp事件并且按下的键为“delete”时执行此命令。

当我偶然发现这个例子中的交互触发器时,我接近找到了解决方案:

http://joyfulwpf.blogspot.com/2009/05/mvvm-invoking-command-on-attached-event.html?showComment=1250325648481#c3867495357686026904

现在这个演示的问题是命令参数是按下的键,但在我的情况下,我需要命令参数是SelectedItems属性,我需要命令只在特定键上执行。

有没有办法在没有太多开销和MVVM方式的情况下做到这一点?

这样的事情会很棒:

<i:Interaction.Triggers>
   <i:EventTrigger EventName="KeyUp">
      <local:CommandAction Command="{Binding RemoveItemCommand}"
                           CommandParameter={Binding ElementName=MyListView, Path=SelectedItems}
                           EventArgument="Key.Delete"/>
   </i:EventTrigger>
</i:Interaction.Triggers>

2 个答案:

答案 0 :(得分:2)

要以MVVM方式执行此操作,您需要将ListView的“SelectedItems”属性绑定到ViewModel,这样您就可以从命令中使用它,而不需要通过CommandParameter传递它。

答案 1 :(得分:1)

您的分离要求有多严格?如果你没有设计师使用Blend,那么将一个ViewModel方法的调用放入代码隐藏中的KeyUp或PreviewKeyUp事件处理程序。