Search code examples
wpfribbon

WPF Ribbon RibbonCommand replaced by ICommand


I'm looking for an example how to replace this old code for RibbonApplicationMenuItem. Question is how to replace removed RibbonCommand

<ResourceDictionary>
   <r:RibbonCommand 
     x:Key="MenuItem1" 
     CanExecute="RibbonCommand_CanExecute" 
     LabelTitle="Menu Item 1" 
     LabelDescription="This is a sample menu item" 
     ToolTipTitle="Menu Item 1" 
     ToolTipDescription="This is a sample menu item" 
     SmallImageSource="Images\files.png" 
     LargeImageSource="Images\files.png" />
  </ResourceDictionary>
</r:RibbonWindow.Resources>

<r:RibbonApplicationMenuItem Command="{StaticResource MenuItem1}">
</r:RibbonApplicationMenuItem>

Solution

  • You can use RelayCommand.

    Binding in this case is very simple:

    <ribbon:RibbonApplicationMenuItem Header="Hello _Ribbon"
                                  x:Name="MenuItem1"
                                  ImageSource="Images\LargeIcon.png"
                                  Command="{Binding MyCommand}"
                                  />
    

    Your ViewModel class in this case, must contain property MyCommand of ICommand type:

    public class MainViewModel
    {   
        RelayCommand _myCommand;
        public ICommand MyCommand
        {
            get
            {
                if (_myCommand == null)
                {
                    _myCommand = new RelayCommand(p => this.DoMyCommand(p),
                        p => this.CanDoMyCommand(p));
                }
                return _myCommand;
            }
        }
    
        private bool CanDoMyCommand(object p)
        {
            return true;
        }
    
        private object DoMyCommand(object p)
        {
            MessageBox.Show("MyCommand...");
            return null;
        }
    }
    

    Don't forget assign DataContext of MainWindow:

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new MainViewModel();
    }
    

    RelayCommand class:

    public class RelayCommand : ICommand
    {
        #region Fields
    
        readonly Action<object> _execute;
        readonly Predicate<object> _canExecute;
    
        #endregion // Fields
    
        #region Constructors
    
        public RelayCommand(Action<object> execute)
            : this(execute, null)
        {
        }
    
        public RelayCommand(Action<object> execute, Predicate<object> canExecute)
        {
            if (execute == null)
                throw new ArgumentNullException("execute");
    
            _execute = execute;
            _canExecute = canExecute;
        }
        #endregion // Constructors
    
        #region ICommand Members
    
        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute(parameter);
        }
    
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
    
        public void Execute(object parameter)
        {
            _execute(parameter);
        }
    
        #endregion // ICommand Members
    }