我目前正在重构我的程序以使用 MVVM。我已经尝试使用命令两天了,但我根本找不到使用它们的好方法。
快捷方式只能与 RoutedCommands 和 RoutedUICommands 一起使用,必须在代码隐藏文件中定义 CanExecute 和 Executed 事件处理程序才能访问 ui 元素,这会降低可重用性。
如果命令是在 View 模型中定义的,则无法访问 ui 元素。
两个例子来说明我在这里所说的:
- 我在 DataGrid 中有一个项目列表。当双击 DataGrid 时,应在另一个窗口中打开所选项目。如何在 MouseDoubleClick 事件上调用命令?
- 组合框包含一个值列表。按钮打开一个新窗口,向该列表添加一些内容。窗口关闭后,应选择新值。
我认为应该使用 CommandTarget 属性,但是这怎么可能用 RoutedUICommands 实现呢?
最佳答案
在我看来,您需要使用 RelayCommand
或类似的。这是一个扩展 ICommand
接口(interface)的类,不是 RoatedCommand
...您可以将其视为一个委托(delegate)
命令。您无需为每个命令定义单独的类,只需内联定义命令逻辑和 canExecute
处理程序即可。这是一个简化的示例:
public ICommand SaveCommand
{
get { return new RelayCommand(execute => Save(), canExecute => CanSave()); }
}
您可以在 RelayCommand.cs 中找到它的实现GitHub 上的页面以及 Commands, RelayCommands and EventToCommand 中的描述MDSN 杂志上的页面。
最后,您可以使用 KeyBinding
类为这些命令设置键盘快捷键:
<KeyBinding Gesture="CTRL+S" Command="{Binding Save, Mode=OneWay}" />
关于c# - 如何使用RouteUICommand?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20950685/