Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mvvm RelayCommand lambda语法问题_Mvvm_Lambda_Relaycommand - Fatal编程技术网

Mvvm RelayCommand lambda语法问题

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)

我正在按照Josh Smith的要求应用MVVM模式,但遇到了困难。我一直在这里研究这个问题,但似乎不能完全正确地理解语法

在我看来,下面的代码似乎遵循了所需的语法,但Visual Studio报告错误“委托”系统。操作“不接受指定行上的“2”参数”

有人能看出我在哪里犯了错误吗?谢谢
+汤姆

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类型。请记录