0

当我实现ICommand接口时,会创建以下方法

#region ICommand Members

    public bool CanExecute(object parameter)
    {
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
    }

#endregion

有趣的部分是

public void Execute(object parameter)
{
}

仅仅是因为它表明它需要 1 个参数。如果我不需要传递参数怎么办?在我的 ViewModel 我有以下代码

public class DownloadViewModel : BaseViewModel
{
    public ICommand BrowseForFile { get; set; }

    public string File { get; set; }

    public DownloadViewModel()
    {
        BrowseForFile = new RelayCommand(new Action<object>(OpenDialog));
    }

    private void OpenDialog(object o)
    {
        var dialog = new System.Windows.Forms.FolderBrowserDialog();
        System.Windows.Forms.DialogResult result = dialog.ShowDialog();
        File = dialog.SelectedPath;
    }
}

OpenDialog方法不需要参数,但似乎我必须这样做才能满足接口。

我这样做是对的还是我错过了重点?

4

2 回答 2

2

Execute接受参数的事实与您的ViewModel. 唯一影响参数OpenDialog需求的是您对ICommand.

例如,如果您的实现是:

public class MyRandomCommand : ICommand
{
    private readonly Action _action;

    public MyRandomCommand(Action action)
    {
        _action = action;
    }

    public void Execute(object parameter)
    {
        _action();
    }

    ...
}

然后,您的方法不需要任何参数OpenDialog,因为您可以按如下方式创建命令:

public ICommand Command { get { return new MyRandomCommand(OpenDialog); } }

但是,对于传递给命令的方法,您可以要求任何您喜欢的签名。

最常见的、现成的实现RelayCommand可以采用带有 0 或 1 参数的方法,并将被Execute适当地调用。

于 2013-03-08T09:28:41.433 回答
2

是的,ICommand总是需要一个对象RelayCommand。如果你不需要它,你传递 null 并且不要在你的方法中使用它,这很丑陋。

我会用棱镜DelegateCommand代替。这存在于不带参数的非通用版本中:

Command = new DelegateCommand(DoSomething);
CommandWithParameter = new DelegateCommand<int>(DoSOmethingWithInt);

它在 PRISM 程序集中,您必须下载和参考。

using Microsoft.Practices.Prism;

棱镜

或者,使用 MVVMLight 工具包,它提供了一个基本相同的命令类。无论如何,在没有 MVVM 框架的情况下使用 MVVM 是没有意义的。我可以推荐 PRISM,也因为它是基本的东西,比如DelegateCommandEventAggregator.

于 2013-03-08T09:31:09.410 回答