如何使用RoutedUICommand?

时间:2014-01-06 13:05:14

标签: c# wpf mvvm command icommand

我目前正在重构我的程序以使用MVVM。我现在尝试使用命令2天,但我找不到使用它们的好方法。
快捷方式只能与RoutedCommands和RoutedUICommands一起使用,必须在代码隐藏文件中定义CanExecute和Executed事件处理程序才能访问ui元素,从而降低了可重用性。
如果在viewmodel中定义了命令,则无法访问ui-elements。
2个例子来说明我在这里说的话:

  1. 我有一个DataGrid中的项目列表。当执行双击DataGrid时,应在另一个窗口中打开所选项目。如何在MouseDoubleClick事件上调用命令?
  2. ComboBox包含值列表。按钮打开一个新窗口,向该列表添加内容。窗口关闭后,应选择新值。
    我认为应该使用CommandTarget属性,但是如何使用RoutedUICommands呢?

2 个答案:

答案 0 :(得分:5)

听起来我需要使用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}" />

答案 1 :(得分:0)

由于无法通过问题给出所需的答案,我将自己回答 我使用Commands作为我的viewmodel的静态属性,这是一个糟糕的方法。切换到普通属性后,一切都像魅力一样!