【发布时间】:2011-05-13 06:16:26
【问题描述】:
RoutedCommand 和 RoutedUICommand 有很多用途。内置对文本和键盘手势的支持。您可以将 RoutedUICommands 集合绑定到菜单的 ItemsSource,它会自动为您创建和绑定菜单项。开箱即用的控件自动支持某些命令(剪切、复制、粘贴)。
但是,每当我使用 MVVM 时,我发现路由命令并不合适,因为我必须为每个命令编写重复的样板 XAML 和代码隐藏。当我在做 MVVM 时,我通常会使用 RelayCommand 而不是路由命令。这在某些时候是一种适当的解决方法,但它也有缺点——例如,按键手势变成much more complicated。
但是在看了 Rob Eisenberg 的"Build your own MVVM Framework" 会话之后,我不再对中继命令及其缺点感到满意。路由命令的唯一问题是重复的样板代码,一旦将重复的代码分解到框架中并应用约定,似乎不再有任何理由不在 MVVM 中使用路由命令。
从技术上讲,这看起来并不难。框架应该只需要绑定到视图的CommandManager.CanExecute 和Executed 事件,并应用约定来查找 ViewModel 上的方法和属性——例如,当执行 Cut 命令时,查找 ExecuteCut 方法(以及ViewModel 上的 CanExecuteCut 属性)。我可以构建自己的 MVVM 框架,让这一切变得简单。
但我的问题是,是否已经有与 RoutedCommand 一起使用的 MVVM 框架? 我最熟悉的唯一 MVVM 框架是 Caliburn.Micro,它目前不支持路由以这种方式命令(这让我感到惊讶,因为它确实支持自己的动作冒泡风格)。
【问题讨论】:
标签: mvvm routed-commands caliburn.micro