【问题标题】:Can I simplify this code? And if so how我可以简化这段代码吗?如果是这样的话
【发布时间】:2015-10-11 02:16:31
【问题描述】:

我正在尝试向我的第一个 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();
    }

【问题讨论】:

  • 您是否使用任何 MVVM 框架(例如:MVVM Light)?
  • 我不是,我阅读了一些关于 MVVM 的文章并观看了一些视频,现在我正试图将我的头脑全部包裹起来。我想我理解它的一般要点。为什么?
  • 看看我的答案 :-)

标签: c# simplification


【解决方案1】:

您是否正在寻找减少代码重复的基类?

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

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

【讨论】:

  • 非常有趣,我不知道我可以将构造函数基于父构造函数。我会玩这个
【解决方案2】:

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

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

这是由 MVVM Light 的开发者 Laurent Bugnion 编写的 tutorial。使用它,您不必每次要绑定命令时都创建新类,因此将“尽可能多地防止重复”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多