3

将 WPF 命令实现为独立对象是否可能/可行?如果是这样,这通常是如何完成的?我看到的大多数关于命令的示例通常涉及使用 RoutedCommand、RoutedUICommand 或 ICommand 的其他一些实现,例如 RelayCommand。这些命令在 MVVM 模式中的工作方式是通过属性公开这些命令类型之一的实例。在 ViewModel 内部,命令的逻辑被实现为 ViewModel 上的一个方法,然后作为委托传递给命令对象。

据我了解,“经典”命令模式是将每个命令实现为它自己的独立对象,例如 OpenCustomerViewCommand。由于逻辑将完全封装在它自己的对象中,因此它可能会在我的应用程序的其他部分中重用。例如,如果我可以从我的应用程序中的多个位置打开 CustomerView,那么能够简单地在可以访问 CustomerView 的每个 ViewModel 上创建 OpenCustomerViewCommand 的实例可能会有所帮助,而不是将该方法复制并粘贴到每个 ViewModel ,并将委托传递给 RelayCommand。如果我理解正确,预定义的应用程序命令(例如剪切和粘贴)会以这种方式运行。

对我来说,必须在 ViewModel 中提供逻辑似乎会降低命令模式的价值。我想我并不真正理解这样做与背后的代码实现 UI 事件的命令处理程序之间的主要区别。有什么理由我应该使用 RoutedCommand 模式而不是我上面描述的更经典的方法?

4

1 回答 1

3

您可以这样做,但它需要某种方法来适当地路由请求。

在您的示例中,只要OpenCustomerViewCommand知道如何以及在何处打开“客户视图”,您就可以轻松地在任何地方重用它。RelayCommand您可以直接实现ICommand并添加逻辑来执行此操作,而不是使用类似的类。

然而,问题在于大多数命令往往更像是 xaml 的适配器,以执行特定于 ViewModel 的功能。在我工作过的大多数应用程序中,真正需要重用的命令往往很少——大多数命令都与相关 ViewModel 的特定功能相关联。因此,像 RelayCommand 这样的东西使连接起来相当容易。

于 2011-12-29T00:56:14.827 回答