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吗