我能简化这段代码吗?如果是的话,又该怎么做呢?

本文关键字:如果 段代码 代码 | 更新日期: 2023-09-27 18:17:10

我试图在我的第一个MVVM程序中添加多个命令。但我觉得我在这里添加它们的方式不对。我想尽量避免重复,比如,我能不能创建一种易于修改的父命令?

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();
    }

我能简化这段代码吗?如果是的话,又该怎么做呢?

您正在寻找一个基类来减少代码重复吗?

如果是,这可能对你有用:

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();
    }
}

Enigmativity给出的答案很好,因为你要求一种优化代码的方法。

但是,在MVVM中,当涉及到使用ICommand时,通常我们使用在项目使用的MVVM框架中实现的RelayCommand

这是一个由Laurent Bugnion编写的教程,他是MVVM Light的开发者。使用它,你就不必每次绑定命令时都创建一个新类,因此可以"尽可能地防止重复"。