MVVM中的Silverlight热键命令?

我正在尝试基于Silverlight中的击键来触发命令。 据我了解,您无法在Silverlight中使用AccessKey或AcceleratorKey。 它看起来可能是有用的附加属性InputBindings也不起作用。

我开始在其他地方寻找。 看起来Prism是让Silverlight中的命令工作的方式,所以我检查了一下。 但是它们只有一个Click处理程序,它甚至不是设置关键命令的有用起点。

我只是错过了Prism的某些部分吗? 或者有一个很好的标准方法来处理MVVM Silverlight的热键?

听起来你正在寻找处理KeyUp / KeyPress / KeyDown事件的“无代码”MVVMish方式。

选项#1:棱镜。
您已经提到它只随附 Click命令。 但是,您可以添加自己的附加DP,以便为您喜欢的任何事件启用命令(如KeyUp / KeyDown / KeyPress)。

如果你正在寻找一个样本,那么Corey有一个很好的ToggleButton.Checked / Unchecked事件。
http://www.85turns.com/2009/06/24/togglebutton-command-for-prism/

 

此外,Erik Mork还有一个出色的video,可以让您对命令以及如何创建自定义命令Attached DP有一个很好的概述。 http://development-guides.silverbaylabs.org/Video/Prism-Commands

选项#2:混合触发器
Expression Blend SDK附带了触发器和行为,这些触发器和行为可以指向您尝试执行的操作。
Blend示例 codeplex项目随附一个您可以使用的EventTrigger:

    

或者,您可以为按键描边事件创建自己的自定义触发器,并根据您的喜好进行操作。 这是一个示例:
http://azurecoding.net/blogs/brownie/archive/2009/04/06/blend-behaviors-ftw.aspx

你是说像Ctrl + v或类似我在MSDN网站上看到以下示例。

 void Canvas_KeyUp(object sender, KeyEventArgs e) { //check for the specific 'v' key, then check modifiers if (e.Key==Key.V) { if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) { //specific Ctrl+V action here } } // else ignore the keystroke } 

MVVM工具包包含一个有趣的CommandReference类,允许您将InputBindings绑定到ViewModel命令。 我不确定它适用于Silverlight,但你可以尝试一下……

好的,正如RandomEngy指出的那样,Silverlight中没有InputBindings ……

但是,我认为你可以使用附加的行为。 这是一种将事件“绑定”到ViewModel命令的方法。 Marlon Grech 在这里有很好的实施