c# - 如何使用RouteUICommand?

标签 c# wpf mvvm command icommand

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

  1. 我在 DataGrid 中有一个项目列表。当双击 DataGrid 时,应在另一个窗口中打开所选项目。如何在 MouseDoubleClick 事件上调用命令?
  2. 组合框包含一个值列表。按钮打开一个新窗口,向该列表添加一些内容。窗口关闭后,应选择新值。
    我认为应该使用 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/

相关文章:

wpf - DataGrid 未绑定(bind)(XAML + ViewModel + ObservableCollection)

c# - 如何使用 MVVM 模式在 WPF 中创建动态表单?

wpf - 如何立即更新 WPF 绑定(bind)

wpf - 值对象和 View 模型属性

c# - 乔什·史密斯文章的解释

c# - 使用电子邮件地址的 Asp.Net 身份验证

c# - 仅在任务 RanToCompletion 上使用 SynchronizationContext

c# - Visual Studio 引用

wpf - 列表项目选择无法正常工作?

c# - 使用 List<T> 和公开 Collection<T> 的最佳方式