Mvvm RelayCommand lambda语法问题
我正在按照Josh Smith的要求应用MVVM模式,但遇到了困难。我一直在这里研究这个问题,但似乎不能完全正确地理解语法 在我看来,下面的代码似乎遵循了所需的语法,但Visual Studio报告错误“委托”系统。操作“不接受指定行上的“2”参数” 有人能看出我在哪里犯了错误吗?谢谢Mvvm RelayCommand lambda语法问题,mvvm,lambda,relaycommand,Mvvm,Lambda,Relaycommand,我正在按照Josh Smith的要求应用MVVM模式,但遇到了困难。我一直在这里研究这个问题,但似乎不能完全正确地理解语法 在我看来,下面的代码似乎遵循了所需的语法,但Visual Studio报告错误“委托”系统。操作“不接受指定行上的“2”参数” 有人能看出我在哪里犯了错误吗?谢谢 +汤姆 RelayCommand\u RelayCommand\u向上移动; 公共ICommand RelayCommand\u向上移动 { 得到 { if(_relayCommand_MoveUp==null)
+汤姆
RelayCommand\u RelayCommand\u向上移动;
公共ICommand RelayCommand\u向上移动
{
得到
{
if(_relayCommand_MoveUp==null)
{
_relayCommand\u MoveUp=新的relayCommand(
(发送方,e)=>此。执行_MoveUp(发送方,e),**此处报告错误**
(发送方,e)=>此.CanExecute_MoveUp(发送方,e));
返回relayCommand MoveUp;
}
}
}
私有void Execute\u MoveUp(对象发送方,ExecutedRoutedEventArgs e)
{
如果(_selectedFolder!=null)
{
_selectedFolder.SelectParent();
}
}
私有void CanExecute_MoveUp(对象发送方,CanExecuteRouteEventArgs e)
{
e、 CanExecute=(\u selectedFolder!=null)&&(\u selectedFolder.Parent!=null);
}
//来自乔希·史密斯:
公共类中继命令:ICommand
{
公共中继命令(动作执行);
公共RelayCommand(操作执行、谓词canExecute);
公共事件处理程序CanExecuteChanged;
[调试步骤至]
公共布尔CanExecute(对象参数);
public void Execute(对象参数);
}
RelayCommand不是RoutedCommand,我想这就是你最后困惑的地方
中继命令的构造函数采用and和optional。这些委托不接受EventArgs,只接受单个对象参数,这就是您遇到错误的原因。谓词还需要返回类型bool,这是您将得到的下一个错误。在CanExecute谓词中,您只需返回true/false,而不是像使用RoutedCommand那样设置e.CanExecute
下面是它的外观:
public ICommand RelayCommand_MoveUp
{
get
{
if (_relayCommand_MoveUp == null)
{
_relayCommand_MoveUp = new RelayCommand(Execute_MoveUp, CanExecute_MoveUp);
}
return _relayCommand_MoveUp;
}
}
private void Execute_MoveUp(object sender)
{
if (_selectedFolder != null)
{
_selectedFolder.SelectParent();
}
}
private void CanExecute_MoveUp(object sender)
{
return (_selectedFolder != null) && (_selectedFolder.Parent != null);
}
编辑(从评论中的讨论中添加): 如果您想使用更像RoutedCommands的命令,这将使ViewModels更依赖于WPF特定的视图,那么有一些很好的选项可用 这就产生了将RoutedCommand与MVVM结合使用的整个想法
对于Josh Smith和Bill Kempf提出的问题,这是一个非常可靠的解决方案。RelayCommand不是一个常规命令,我想这就是你最终困惑的地方 中继命令的构造函数采用and和optional。这些委托不接受EventArgs,只接受单个对象参数,这就是您遇到错误的原因。谓词还需要返回类型bool,这是您将得到的下一个错误。在CanExecute谓词中,您只需返回true/false,而不是像使用RoutedCommand那样设置e.CanExecute 下面是它的外观:
public ICommand RelayCommand_MoveUp
{
get
{
if (_relayCommand_MoveUp == null)
{
_relayCommand_MoveUp = new RelayCommand(Execute_MoveUp, CanExecute_MoveUp);
}
return _relayCommand_MoveUp;
}
}
private void Execute_MoveUp(object sender)
{
if (_selectedFolder != null)
{
_selectedFolder.SelectParent();
}
}
private void CanExecute_MoveUp(object sender)
{
return (_selectedFolder != null) && (_selectedFolder.Parent != null);
}
编辑(从评论中的讨论中添加): 如果您想使用更像RoutedCommands的命令,这将使ViewModels更依赖于WPF特定的视图,那么有一些很好的选项可用 这就产生了将RoutedCommand与MVVM结合使用的整个想法 对于Josh Smith和Bill Kempf提出的问题,这是一个非常可靠的解决方案。本周末(8月22日),Josh Smith为他的MvvmFoundation项目检查了codeplex的新变化,该项目改变了RelayCommand为具有参数的代表工作的方式。当心 要将参数传递给委托,您需要使用其新的RelayCommand构造函数:
public ICommand GotoRegionCommand
{
get
{
if (_gotoRegionCommand == null)
_gotoRegionCommand = new RelayCommand<String>(GotoRegionCommandWithParameter);
return _gotoRegionCommand;
}
}
private void GotoRegionCommandWithParameter(object param)
{
var str = param as string;
}
public ICommand和GotoRegionCommand
{
得到
{
if(_gotoRegionCommand==null)
_gotoRegionCommand=新的RelayCommand(GOTOREGIONCOMMANDWITH参数);
return_gotoRegionCommand;
}
}
私有void GotoRegionCommandWithParameter(对象参数)
{
var str=param作为字符串;
}
本周末(8月22日),Josh Smith为他的MvvmFoundation项目检查了codeplex的新变化,该项目改变了RelayCommand为具有参数的代表工作的方式。当心
要将参数传递给委托,您需要使用其新的RelayCommand构造函数:
public ICommand GotoRegionCommand
{
get
{
if (_gotoRegionCommand == null)
_gotoRegionCommand = new RelayCommand<String>(GotoRegionCommandWithParameter);
return _gotoRegionCommand;
}
}
private void GotoRegionCommandWithParameter(object param)
{
var str = param as string;
}
public ICommand和GotoRegionCommand
{
得到
{
if(_gotoRegionCommand==null)
_gotoRegionCommand=新的RelayCommand(GOTOREGIONCOMMANDWITH参数);
return_gotoRegionCommand;
}
}
私有void GotoRegionCommandWithParameter(对象参数)
{
var str=param作为字符串;
}
谢谢你,先生。那么,我是否正确理解,如果我需要访问被调用方法中的EventArgs,我就不能使用RelayCommand类来调用它+没错,基本的ICommand没有实现任何事件,事实上,就我所知RoutedCommand也没有,它们实际上来自一种叫做CommandBinding的东西,这就是RoutedCommand所寻找的。我在我的帖子中添加了一些MVVM中RoutedCommands的附加信息,因为这条评论中没有足够的空间=)CanExecute_MoveUp(对象发送方)方法必须返回bool类型。请纠正一下,谢谢你。那么,我是否正确理解,如果我需要访问被调用方法中的EventArgs,我就不能使用RelayCommand类来调用它+没错,基本的ICommand没有实现任何事件,事实上,就我所知RoutedCommand也没有,它们实际上来自一种叫做CommandBinding的东西,这就是RoutedCommand所寻找的。我在我的帖子中添加了一些MVVM中RoutedCommands的附加信息,因为这条评论中没有足够的空间=)CanExecute_MoveUp(对象发送方)方法必须返回bool类型。请记录