Автономные объекты команд в WPF - PullRequest
3 голосов
/ 29 декабря 2011

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

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

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

1 Ответ

3 голосов
/ 29 декабря 2011

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

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

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

...