WPF中的独立命令对象

WPF中的独立命令对象,wpf,command,routed-commands,command-pattern,Wpf,Command,Routed Commands,Command Pattern,作为独立对象实现WPF命令是否可行?如果是,通常是如何做到的?我看到的关于命令的大多数示例通常涉及使用RoutedCommand、RoutedUICommand或其他ICommand实现,如RelayCommand。这些命令在MVVM模式中的工作方式是通过属性公开这些命令类型之一的实例。在ViewModel内部,命令的逻辑作为ViewModel上的方法实现,然后作为委托传递给命令对象 我所理解的“经典”命令模式是将每个命令实现为它自己的独立对象,例如OpenCustomerServiceComm

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

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


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

您可以这样做,但它需要一些适当的路由请求的方法

在您的示例中,如果
OpenCustomerViewCommand
知道如何以及在何处打开“客户视图”,您可以轻松地在任何地方重用它。您可以直接实现
ICommand
,并添加逻辑,而不是使用像
RelayCommand
这样的类

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