【问题标题】:How to use RoutedUICommand?如何使用 RoutedUICommand?
【发布时间】:2014-01-06 13:05:13
【问题描述】:
我目前正在重构我的程序以使用 MVVM。我已经尝试使用命令 2 天了,但我根本找不到使用它们的好方法。
快捷方式只能与 RoutedCommands 和 RoutedUICommands 一起使用,必须在代码隐藏文件中定义 CanExecute 和 Executed 事件处理程序才能访问 ui 元素,这会降低可重用性。
如果在视图模型中定义了命令,则无法访问 ui 元素。
2 个例子来说明我在说什么:
- 我在 DataGrid 中有一个项目列表。双击 DataGrid 时,应在另一个窗口中打开所选项目。如何在 MouseDoubleClick 事件上调用命令?
- ComboBox 包含一个值列表。一个按钮会打开一个新窗口,向该列表中添加一些内容。窗口关闭后,应选择新值。
我认为应该使用 CommandTarget 属性,但是如何使用 RoutedUICommands 呢?
【问题讨论】:
标签:
c#
wpf
mvvm
command
icommand
【解决方案1】:
在我看来,您需要使用 RelayCommand 或类似名称。这是一个扩展ICommand 接口的类,不是RoutedCommand...你可以把它想象成一个delegate 命令。您可以简单地定义命令逻辑和内联的canExecute 处理程序,而不是为每个命令定义一个单独的类。这是一个简化的例子:
public ICommand SaveCommand
{
get { return new RelayCommand(execute => Save(), canExecute => CanSave()); }
}
您可以在 GitHub 上的 RelayCommand.cs 页面中找到它的实现,并在 MDSN 杂志上的 Commands, RelayCommands and EventToCommand 页面中找到它的描述。
最后,您可以使用KeyBinding 类为这些命令设置键盘快捷键:
<KeyBinding Gesture="CTRL+S" Command="{Binding Save, Mode=OneWay}" />
【解决方案2】:
由于问题无法给出所需的答案,我将自己回答。
我使用命令作为我的视图模型的静态属性,这是一种不好的方法。切换到普通属性后,一切都像魅力一样!