【问题标题】:How to use RoutedUICommand?如何使用 RoutedUICommand?
【发布时间】:2014-01-06 13:05:13
【问题描述】:

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

  1. 我在 DataGrid 中有一个项目列表。双击 DataGrid 时,应在另一个窗口中打开所选项目。如何在 MouseDoubleClick 事件上调用命令?
  2. 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】:

      由于问题无法给出所需的答案,我将自己回答。
      我使用命令作为我的视图模型的静态属性,这是一种不好的方法。切换到普通属性后,一切都像魅力一样!

      【讨论】:

        猜你喜欢
        • 2014-02-03
        • 2017-06-16
        • 1970-01-01
        • 2014-07-19
        • 2012-02-26
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 2014-03-02
        相关资源
        最近更新 更多