通过ICommand传递参数

时间:2017-02-02 22:30:55

标签: c# mvvm mvvmcross

如果我没有从视图中传递任何内容,则以下情况有效。

View.cs

ViewModel.ReloadCommand.Execute(null);

ViewModel.cs

public ICommand ReloadCommand
{
  get
   {
      return new MvxCommand(async () =>
         {
            await RefreshStudentList();
         });
    }
}

但是我需要传递一个参数,我想知道我该怎么做?

ViewModel.ReloadCommand.Execute(xxx);

ViewModel.cs

public ICommand ReloadCommand
{
  get
   {
      return new MvxCommand(async () =>
         {
            await RefreshStudentList(xxx);
         });
    }
}

4 个答案:

答案 0 :(得分:3)

我不熟悉MvvmCross,但据我所知,它会是这样的:

public ICommand ReloadCommand
{
    get
    {
        return new MvxCommand<XXXType>(async (xxx) =>
            {
                await RefreshRoutesList(xxx);
            });
    }
}

答案 1 :(得分:2)

要执行异步操作,MvvmCross还有一个MvxAsyncCommand,它也可以将参数作为常规MvxCommand

它看起来像这样:

public ICommand ReloadCommand
{
    return new MvxAsyncCommand(DoAsyncStuff);
}

private Task DoAsyncStuff(MyType type)
{

}

任何命令都可以使用如下参数执行:

ViewModel.ReloadCommand.Execute(myParameter);

答案 2 :(得分:0)

请先尝试初始化ViewModel View,而不是这样做。然后,根据您的代码,ICommand仅执行RefreshRoutesList功能,因此我将直接从RefreshRoutesList访问View。为了明确命名,我将使用MyView.csMyViewModel.cs

<强> MyView.cs

MyViewModel vm;
.
.
protected override void OnCreate(Bundle bundle)
{
    .... //other stuff
    vm = ViewModel as MyViewModel;
}

完成此操作后,您可以使用vm变量,即

在视图中的任何位置调用您的函数
await vm.RefreshRoutesList(aParameter);

希望这可以提供帮助。

答案 3 :(得分:0)

您可能正在寻找的答案不是......

我对Mvvm的理解是它反映了View的状态并对View中的命令作出反应。您的参数可以被视为State,因此它应该在ViewModel上具有它将绑定到的自己的Property。因此,您的Command不必传递参数。这也将进一步将ViewModel与View的实现分离。