Команды в WPF, вопрос реализации - PullRequest
2 голосов
/ 08 февраля 2010

Я знаю, что уже задавал вопросы по этому вопросу, но это просто сбивает с толку. Я делаю учебное пособие по шаблону WPF MVVM, но, похоже, я не могу понять его правильно, так как в учебном пособии не рассматриваются детали реализации интерфейса ICommand. (не уверен, насколько это правильно на самом деле? !!)

У меня есть следующая реализация ICommand:

class ViewCommand : ICommand
    {
        #region ICommand Members

        private Predicate<object> _canExecute;
        private Predicate<bool> _execute(object param);

        public ViewCommand(Action<object> action)
        {

        }

        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute(parameter);
        }

        public void Execute(object parameter)
        {
            _execute(parameter);
        }

        public event EventHandler CanExecuteChanged 
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        #endregion
    }

и теперь это использование:

class StartViewModel : ViewModel
    {
        public ViewCommand startViewCommand;

        public ViewCommand StartCommand
        {
            get
            {
                if (startViewCommand == null)
                    startViewCommand = new ViewCommand(
                        param => this.StartApplication()); // StartApplication returns void
                return startViewCommand;
            }
        }

Я не могу понять, что должен делать мой конструктор класса ViewCommand? В классе StartViewModel он использует лямбда-выражение в конструкторе, поэтому должен быть какой-то делегат, но я не уверен, что и как он предназначен для работы с Execute и CanExecute. Я поставил Action<object>, но это, вероятно, неправильно ...

Наконец, кто-то может указать мне учебник о том, как реализовать ICommand, который объясняет это?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 февраля 2010

Посмотрите на учебник Джоша Смита обратите внимание на команду реле, где он ее реализует.

0 голосов
/ 08 февраля 2010

Ваш _execute делегат не должен быть Predicate<bool>, он должен быть Action<object>. В любом случае, почему бы вам не использовать существующий класс, такой как RelayCommand Джоша Смита или инструментарий MVVM DelegateCommand?

...