Mvvm ICommand是否总是需要对象作为参数?

Mvvm ICommand是否总是需要对象作为参数?,mvvm,icommand,relaycommand,Mvvm,Icommand,Relaycommand,当我实现ICommand接口时,会创建以下方法 #region ICommand Members public bool CanExecute(object parameter) { } public event EventHandler CanExecuteChanged; public void Execute(object parameter) { } #endregion 有趣的是 public void Execute(

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

#region ICommand Members

    public bool CanExecute(object parameter)
    {
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
    }

#endregion
有趣的是

public void Execute(object parameter)
{
}
只是因为它表明它需要一个参数。如果我不需要传递参数呢?在我的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;
    }
}
公共类下载视图模型:BaseViewModel
{
公用ICommand浏览文件{get;set;}
公共字符串文件{get;set;}
公共下载视图模型()
{
BrowseForFile=new RelayCommand(新建操作(OpenDialog));
}
私有void OpenDialog(对象o)
{
var dialog=new System.Windows.Forms.FolderBrowserDialog();
System.Windows.Forms.DialogResult=dialog.ShowDialog();
File=dialog.SelectedPath;
}
}
OpenDialog
方法不需要参数,但似乎我必须这样做才能满足接口的要求


我这样做是正确的还是没有抓住重点?

执行
获取参数的事实与
视图模型中的方法无关。影响
OpenDialog
所需参数的唯一因素是
ICommand
的实现

例如,如果您的实现是:

public类myrandom命令:ICommand
{
私有只读操作\u操作;
公共MyRandomCommand(操作)
{
_行动=行动;
}
public void Execute(对象参数)
{
_动作();
}
...
}
然后,您的
OpenDialog
方法将不需要任何参数,因为您可以创建如下命令:

public ICommand命令{get{返回新的MyRandomCommand(OpenDialog);}
但是,对于要传递给命令的方法,您可以要求任何您喜欢的签名


RelayCommand
最常见的现成实现可以采用带有0或1个参数的方法,并将从
Execute
适当调用。
Execute
采用参数的事实与
视图模型中的方法无关。影响
OpenDialog
所需参数的唯一因素是
ICommand
的实现

例如,如果您的实现是:

public类myrandom命令:ICommand
{
私有只读操作\u操作;
公共MyRandomCommand(操作)
{
_行动=行动;
}
public void Execute(对象参数)
{
_动作();
}
...
}
然后,您的
OpenDialog
方法将不需要任何参数,因为您可以创建如下命令:

public ICommand命令{get{返回新的MyRandomCommand(OpenDialog);}
但是,对于要传递给命令的方法,您可以要求任何您喜欢的签名


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

是的,
ICommand
始终需要一个对象和
RelayCommand
。如果您不需要它,则传递null并在方法中不使用它,这很难看

我会使用Prism的
DelegateCommand
。这存在于非泛型版本中,不接受参数:

Command=newdelegatecommand(DoSomething);
CommandWithParameter=newdelegateCommand(DoSOmethingWithInt);
它位于PRISM组件中,您必须下载并参考该组件

using Microsoft.Practices.Prism;


或者,使用MVVMLight工具包,它提供了一个命令类,基本上完成了相同的任务。无论如何,在没有MVVM框架的情况下使用MVVM是没有意义的。我可以推荐PRISM,也因为它的基本功能,如
DelegateCommand
EventAggregator

是的,
ICommand
总是需要一个对象和
RelayCommand
。如果您不需要它,则传递null并在方法中不使用它,这很难看

我会使用Prism的
DelegateCommand
。这存在于非泛型版本中,不接受参数:

Command=newdelegatecommand(DoSomething);
CommandWithParameter=newdelegateCommand(DoSOmethingWithInt);
它位于PRISM组件中,您必须下载并参考该组件

using Microsoft.Practices.Prism;


或者,使用MVVMLight工具包,它提供了一个命令类,基本上完成了相同的任务。无论如何,在没有MVVM框架的情况下使用MVVM是没有意义的。我可以推荐PRISM,同样是因为它的基本功能,如
DelegateCommand
EventAggregator

我想问题的关键是,
OpenDialog
是否需要参数我把这个问题理解为“如果我不需要参数,如何在命令操作中去掉参数?”很有趣。这个问题确实显得有些模棱两可。我感觉OP很困惑,认为
OpenDialog
Execute
的实现,而不仅仅是它调用的。@Scroog1和Marc-很抱歉问题不够清晰,但谢谢你们两位。问题是,我是否被迫传递一个参数,即使我不需要它。虽然Prism/MVVVM灯光可能是一个答案,但目前我需要学习基础知识,因此将继续使用丑陋的方法!谢谢。我想问题的重点是,
OpenDialog
是否需要参数?我把这个问题理解为“如果我不需要参数,如何在命令操作中去掉参数?”很有趣。这个问题确实显得有些模棱两可。我感觉OP很困惑,认为
OpenDialog
Execute
的实现,而不仅仅是它调用的。@Scroog1和Marc-很抱歉问题不够清晰,但谢谢你们两位。问题是,我是C吗