Автономные объекты команд в WPF

Возможно ли / практично реализовать команды WPF как отдельные объекты? Если да, то как это обычно делается? Большинство примеров команд, которые я вижу, обычно связаны с использованием RoutedCommand, RoutedUICommand или какой-либо другой реализации ICommand, например RelayCommand. Эти команды работают в шаблоне MVVM, чтобы предоставить экземпляр одного из этих типов команд через свойство. Внутри ViewModel логика команды реализуется как метод в ViewModel, а затем передается как делегат объекту команды.

«Классический» шаблон команд, как я понимаю, будет заключаться в том, чтобы каждая команда была реализована как отдельный отдельный объект, такой как OpenCustomerViewCommand. Поскольку логика будет полностью инкапсулирована в отдельный объект, ее потенциально можно будет повторно использовать в других частях моего приложения. Например, если бы я мог открывать CustomerView из нескольких мест в моем приложении, было бы полезно иметь возможность просто создать экземпляр OpenCustomerViewCommand на каждой ViewModel, где можно было бы получить доступ к CustomerView, вместо того, чтобы копировать и вставлять этот метод в каждую ViewModel. и передайте делегат RelayCommand. Если я правильно понимаю, предопределенные ApplicationCommands, такие как Cut и Paste, ведут себя именно так.

Мне кажется, что необходимость предоставления логики внутри ViewModel немного снижает значение шаблона команды. Полагаю, я действительно не понимаю основной разницы между этим способом и наличием кода, реализующего обработчики команд для событий пользовательского интерфейса. Есть ли причина, по которой мне следует использовать шаблон RoutedCommand вместо более классического подхода, который я описал выше?


person mclark1129    schedule 29.12.2011    source источник


Ответы (1)


Вы могли бы это сделать, но для этого требуется какой-то метод соответствующей маршрутизации запроса.

В вашем примере, при условии, что OpenCustomerViewCommand знает как и где открыть «Просмотр клиента», вы можете легко повторно использовать его где угодно. Вместо использования такого класса, как RelayCommand, вы можете просто реализовать ICommand напрямую и добавить для этого свою логику.

Проблема, однако, в том, что большинство команд больше похожи на адаптер для xaml для выполнения специфичных для ViewModel функций. В большинстве приложений, над которыми я работал, обычно мало команд, которые действительно нуждаются в повторном использовании - большинство команд привязаны к функциям, специфичным для рассматриваемой ViewModel. Таким образом, что-то вроде RelayCommand позволяет довольно легко подключить это.

person Reed Copsey    schedule 29.12.2011