Search code examples
c#simplification

Can I simplify this code? And if so how


I am trying to add multiple commands to my very first MVVM program. But the way I am adding them here feels wrong to me. I want to prevent as much duplication as possible, can I make a kind of parent command that I can easily modify for example?

internal class AddTimerBarCommand : ICommand
{
    public AddTimerBarCommand(MainViewModel viewModel)
    {
        _MainViewModel = viewModel;
    }

    private MainViewModel _MainViewModel;
    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        _MainViewModel.AddTimerBar();
    }
}

internal class RmvTimerBarCommand : ICommand
{
    public RmvTimerBarCommand(MainViewModel viewModel)
    {
        _MainViewModel = viewModel;
    }

    private MainViewModel _MainViewModel;
    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        _MainViewModel.RmvTimerBar();
    }

Solution

  • Are you looking for a base class to reduce code duplication?

    If so, this might work for you:

    internal abstract class TimerBarCommandBase : ICommand
    {
        public TimerBarCommandBase(MainViewModel viewModel)
        {
            _MainViewModel = viewModel;
        }
    
        protected MainViewModel _MainViewModel;
        public event EventHandler CanExecuteChanged;
    
        public bool CanExecute(object parameter) { return true; }
    
        public abstract void Execute(object parameter);
    }
    
    internal class AddTimerBarCommand : TimerBarCommandBase
    {
        public AddTimerBarCommand(MainViewModel viewModel) : base(viewModel) { }
    
        public override void Execute(object parameter)
        {
            _MainViewModel.AddTimerBar();
        }
    }
    
    internal class RmvTimerBarCommand : TimerBarCommandBase
    {
        public RmvTimerBarCommand(MainViewModel viewModel) : base(viewModel) { }
    
        public override void Execute(object parameter)
        {
            _MainViewModel.RmvTimerBar();
        }
    }