Does ICommand always requires an object as a parameter?

好久不见. 提交于 2019-12-13 06:19:42

问题


When I implement the ICommand interface, the following methods are created

#region ICommand Members

    public bool CanExecute(object parameter)
    {
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
    }

#endregion

The interesting part is

public void Execute(object parameter)
{
}

Simply because it indicates that it expects 1 parameter. What if I don't need to pass a parameter? In my ViewModel I have the following code

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

The OpenDialog method does not require the parameter but it appears as if I have to just so I can satisfy the Interface.

Am I doing this right or have I missed the point?


回答1:


Yes, ICommand always needs an object and RelayCommand too. If you don't need it, you pass null and don't use it in your method, which is ugly.

I would use Prism's DelegateCommand instead. This exists in a non-generic version, which doesn't take parameters:

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

Its in the PRISM assembly, which you have to download and reference.

using Microsoft.Practices.Prism;

PRISM

Alternatively, use the MVVMLight toolkit, which provides a command class which does basically the same thing. There is no point in using MVVM without a MVVM framework anyway. I can recommend PRISM, also for it's basic stuff like the DelegateCommand or the EventAggregator.




回答2:


The fact that Execute takes a parameter is irrelevant to the method from your ViewModel. The only thing that affects what parameters OpenDialog needs is your implementation of ICommand.

If your implementation is, for example:

public class MyRandomCommand : ICommand
{
    private readonly Action _action;

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

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

    ...
}

Then no parameters will be required for your OpenDialog method, as you can create a command as follows:

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

You can, however, require any signature you like for the method you are passing to your command.

The most common, off-the-shelf implementations of RelayCommand can take methods with either 0 or 1 parameter and will be called from Execute appropriately.



来源:https://stackoverflow.com/questions/15290357/does-icommand-always-requires-an-object-as-a-parameter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!