RoutedCommand 和 RoutedUICommand 对他们有很大帮助。内置对文本和键盘手势的支持。您可以将 RoutedUICommands 集合绑定到菜单的 ItemsSource,它会自动为您创建和绑定菜单项。开箱即用的控件自动支持某些命令(剪切、复制、粘贴)。
然而,每当我使用 MVVM 时,我发现路由命令并不适合,因为重复的样板 XAML 和代码隐藏我必须为每个命令编写。当我在做 MVVM 时,我通常会使用RelayCommand而不是路由命令。这在某些时候是一个足够的解决方法,但它也有缺点——例如,按键手势变得更加复杂。
但是在观看了 Rob Eisenberg 的“构建你自己的 MVVM 框架”课程之后,我不再对中继命令及其缺点感到满意。路由命令的唯一问题是重复的样板代码,一旦您将重复代码分解到框架中并应用约定,似乎不再有任何理由不在 MVVM 中使用路由命令。
从技术上讲,这看起来并不难。框架应该只需要绑定到视图的CommandManager.CanExecute和Executed事件,并应用约定来查找 ViewModel 上的方法和属性——例如,当执行 Cut 命令时,查找 ExecuteCut 方法(和 CanExecuteCut 属性) 在 ViewModel 上。我可以构建自己的 MVVM 框架,让这一切变得简单。
但我的问题是,是否已经有与 RoutedCommand 一起使用的 MVVM 框架?我熟悉的唯一 MVVM 框架是 Caliburn.Micro,它目前不支持这种方式的路由命令(这让我感到惊讶,因为它确实支持自己的动作冒泡风格)。