2011-12-29 3 views
3

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

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

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

ответ

3

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

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

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