WPF Custom ICommand implementation and the CanExecuteChanged event

后端 未结 2 411
耶瑟儿~
耶瑟儿~ 2021-01-05 19:14

in my WPF UI, I use RoutedCommands that I refer to in my xaml via the following code:

Command=\"viewModel:MessageListViewModel.DeleteMessagesCommand\"


        
相关标签:
2条回答
  • 2021-01-05 19:45

    Just implement the CanExecuteChanged event as follows:

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

    When you assign the command to a control, it subscribes to the CanExecuteChanged event. If you "redirect" it to the CommandManager.RequerySuggested event, the control will be notified whenever CommandManager.RequerySuggested is triggered.

    0 讨论(0)
  • 2021-01-05 19:58

    I very much prefer the DelegateCommand implementation of Prism for viewmodel binding (http://msdn.microsoft.com/en-us/library/ff654132.aspx). You can invoke CanExecute() on every command invoker by calling RaiseCanExecuteChanged on it.

    Simple usage example:

    public class ViewModel
    {
       public ViewModel()
       {
          Command = new DelegateCommand<object>(x => CommandAction(), x => CanCommandAction());
       }
    
       bool state;
    
       public void ChangeState(bool value)
       {
          state = value;
          Command.RaiseCanExecuteChanged();
       }
    
       public DelegateCommand<object> Command {get; private set;}
    
       private void CommandAction()
       {
          //do smthn
       }
    
       private bool CanCommandAction() { return true == state; }
    }
    
    //and binding as usual
    Command="{Binding Command}"
    
    0 讨论(0)
提交回复
热议问题