我目前正在将一个中型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”时执行此命令。
当我偶然发现这个例子中的交互触发器时,我接近找到了解决方案:
现在这个演示的问题是命令参数是按下的键,但在我的情况下,我需要命令参数是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>
答案 0 :(得分:2)
要以MVVM方式执行此操作,您需要将ListView的“SelectedItems”属性绑定到ViewModel,这样您就可以从命令中使用它,而不需要通过CommandParameter传递它。
答案 1 :(得分:1)
您的分离要求有多严格?如果你没有设计师使用Blend,那么将一个ViewModel方法的调用放入代码隐藏中的KeyUp或PreviewKeyUp事件处理程序。