【问题标题】:Attach command with parameter to KeyUp event将带有参数的命令附加到 KeyUp 事件
【发布时间】:2010-07-13 14:57:57
【问题描述】:

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

目标框架是 .NET 3.5.1。

我有一个列表视图,它从底层视图模型中获取其项目。该视图模型公开了从列表视图中删除所选项目的命令。因此,命令参数绑定到列表视图的 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 事件并且按下的键为“删除”时执行此命令。

当我偶然发现此示例中的交互触发器时,我差点找到解决方案:

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>

【问题讨论】:

    标签: c# wpf events mvvm command


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这不是那么严格,这绝对是一个选择,但现在我想要一个严格的分离。这是一种概念证明,我正在尝试探索在使用严格分离的 MVVM 时可能遇到的各种问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多