WPF/SL — Выводится из производной ICommand или делегируется для выполнения / CanExecute

#wpf #silverlight #command

#wpf #silverlight #команда

Вопрос:

Похоже, что большинство фреймворков MVVM используют производную ICommand, где они просто предоставляют делегаты методам Execute / CanExecute в представлении, вместо того, чтобы создавать новый класс и переопределять методы Execute / CanExecute.

Какой дизайн является лучшим? Передача делегатов метода или получение при предоставлении Execute / CanExecute для ICommand?

Кажется, вывод получил бы больше возможностей повторного использования команды в других представлениях и мог бы быть чище? Но для небольших операций выполнения / CanExecute накладные расходы на создание нового производного класса слишком велики, и лучше просто передать delgates методам в представлении?

Спасибо за любую информацию о лучших практиках.

Ответ №1:

Основное неудобство ICommand интерфейса заключается в том, что команда «похоронена» в другом экземпляре класса. Обычно вы хотите, чтобы команда работала с классом, который предоставляет ICommand свойство.

Классический RelayCommand , популяризированный Джошем Смитом, создается путем предоставления лямбда-выражений для методов Execute и CanExecute .

Используя лямбда-выражения для ваших ICommand методов, вы можете «поднять» команду обратно в класс, с которым выполняется действие. Альтернативой является либо тесная связь между классом command и управляемым классом, либо методы пересылки, которые отправляют операции обратно в класс, которому отдается команда.

Лямбда-выражение имеет разрешение на доступ к закрытым элементам, которые находятся в области видимости на момент сборки команды. Это значительно уменьшает неудобства, связанные с тем, что ICommand свойство должно быть отдельным экземпляром класса.

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