2010-02-07 1 views
2

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

У меня есть следующие реализации 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 он использует выражение lambda в конструкторе, поэтому должен быть какой-то делегат, но я не уверен, что и как он должен работать с Execute и CanExecute. Я положил Action<object>, но это, вероятно, неправильно ...

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

Спасибо!

ответ

3

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

0

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