如何在没有参数的情况下实现ICommand

mis*_*han 4 c# mvvm icommand windows-phone-8

在我的项目中,我想使用MVVM(&命令)。我已经开始学习有关ICommand的命令和实现。

我想创建ICommand没有参数的实现。 (触发数据加载/数据刷新等。-我不需要任何参数,因此尝试创建不带参数的命令似乎很自然)

这是我正在使用的代码:

using System.Windows.Input;

public class NoParameterCommand : ICommand
{
    private Action executeDelegate = null;
    private Func<bool> canExecuteDelegate = null;
    public event EventHandler CanExecuteChanged = null;

    public NoParameterCommand(Action execute)
    {
        executeDelegate = execute;
        canExecuteDelegate = () => { return true; };
    }
    public NoParameterCommand(Action execute, Func<bool> canExecute)
    {
        executeDelegate = execute;
        canExecuteDelegate = canExecute;
    }

    public bool CanExecute()
    {
        return canExecuteDelegate();
    }
    public void Execute()
    {
        if (executeDelegate != null)
        {
            executeDelegate();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我遇到了有关不以正确方式实现ICommand接口的错误('XXX.YYYY.NoParameterCommand' does not implement interface member 'System.Windows.Input.ICommand.Execute(object)'

所以我考虑改为这样做:

(添加了CanExecute和中缺少的参数Execute

public class NoParameterCommand : ICommand
{
    ...omitted - no changes here...

    public bool CanExecute(object parameter) //here I added parameter
    {
        return canExecuteDelegate();
    }
    public void Execute(object parameter)    //and here
    {
        if (executeDelegate != null)
        {
            executeDelegate();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 这是一种好的方法吗?
  2. 我应该使用其他方式吗?(如果这样,我应该怎么做?)

O. *_*per 6

  1. 这是一个很好的方法。
  2. 不,您不应使用其他方式。

其他建议:

再次考虑这一点,我将通过引入额外的层次结构where CanExecute()Execute()are 来改善您的体系结构abstract。从该类中,派生调用委托的命令类。

这样,您可以稍后决定是要通过委托还是通过子类化基本命令类来为无参数命令提供逻辑。


Bri*_*all 5

我不确定您要担心的是什么。通常忽略ICommand接口中的参数。

如果您确实想要CanExecuteExecute没有参数的方法,则可以显式(而不是隐式)实现接口。这些ICommand方法仍然存在,但是对于从外部查看您的对象的任何人,他们将无法看到这些方法:

bool ICommand.CanExecute(object parameter) { this.CanExecute(); }

public bool CanExecute()
{
  //do work
}
Run Code Online (Sandbox Code Playgroud)

您实际上是在隐藏接口实现。如果有人想直接CanExecute从接口调用该方法,则必须键入强制转换ICommand为。您这样做确实没有任何收获,但是如果您担心类对外部开发人员的外观(例如,您正在开发API),那么这会让您看起来更干净一些,因为您可以让他们知道您不需要任何参数。