Из-за того, как сформулирован заголовок этого вопроса, читатели могут прийти сюда в поисках альтернативы ICommand
, а не просто способа привязать действие пользовательского интерфейса непосредственно к методу viewModel. (Что не имеет большого значения, поскольку оставляет открытым вопрос, что делать с частью CanExecute.)
Использование ICommand
проблематично само по себе, потому что оно определено в Windows.Input
, а это означает, что для объявления ICommand
s в ваших ViewModels вы должны ссылаться на WPF и кухонную раковину из логики вашего приложения, и как только вы это сделаете, любой новичок может заметить, что MessageBox
и множество других функций графического интерфейса доступны, и могут начать использовать их, что приведет к ужасному беспорядку, состоящему из смешанной логики приложения и логики представления.
Итак, если вы хотите избавиться от using System.Windows
, тогда вам нужно избавиться от ICommand
, а если вы хотите избавиться от ICommand
, то, возможно, вы будете счастливы узнать следующее:
WPF (в частности, конструктор XAML) не требует, чтобы ваши модели представления статически отображали экземпляры интерфейса ICommand
.
Под статически здесь я подразумеваю, что дизайнеру не нужно иметь возможность доказывать во время разработки, используя отражение, что ваши командные объекты реализуют интерфейс ICommand
; вместо этого WPF проверяет во время выполнения, чтобы убедиться, что действия пользовательского интерфейса привязаны к объектам, которые фактически реализуют ICommand
.
Итак, в ваших viewModels (логика приложения) вместо ICommand
интерфейса WPF вы можете использовать некоторый Command
интерфейс вашего собственного устройства, и все, что вам нужно, это убедиться, что класс, который вы будете создавать во время выполнения, для реализации вашего Command
интерфейса также реализует ICommand
, чтобы WPF оставался довольным. Таким образом вы можете избежать включения ICommand
из ваших ViewModels, и впоследствии вы сможете избежать необходимости ссылаться на System.Windows
в логике вашего приложения.
person
Mike Nakis
schedule
06.01.2020