使用MvxCommand与CommandParameter绑定

12

我正在尝试使用带有CommandParameter的fire MvxCommand,但面临以下问题:MvxCommand with CommandParameter

MyView.axml包含:

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button1"
        local:MvxBind="Click MyCommand, CommandParameter=foo" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button2"
        local:MvxBind="Click MyCommand, CommandParameter=bar" />
</LinearLayout>

MyViewModel.cs:

public class MyViewModel : MvxViewModel
{
    public ICommand MyCommand { get; private set; }

    public MyViewModel()
    {                                    // param is null
      MyCommand = new MvxCommand<string>(param =>
      {
          if (param == "foo")               
          {
            // do something
          }
          else if (param == "bar")
          {
            // do something else
          }
      });
    }
}

但是当我检查参数变量时,发现null

我做错了什么?

2个回答

10

您的代码在我源代码树的头部上运行正常。

但这个功能只有两周的历史。

我猜想,这个特性可能没有被包含在您正在使用的版本中,或者存在某些bug。

能否检查下您的调试跟踪记录,看是否有相关信息?

  • 如果跟踪记录表明CommandParameter是一个未知的符号,那么我的猜测是您需要构建最新的源代码或等待新版本发布。
  • 如果跟踪记录提示其他问题,则您可能可以在安装时修复该问题。

有一件事情我们确实修正了,即修复了值转换器问题,其中基于Cirrious.MvvmCross.Binding.dllValueConverter 没有仅通过重写 Setup.ValueConverterAssemblies 来注册CommandParameter所需的ValueConverter


你说得对,Stuart!需要注意查看日志: MvxBind:Warning:132,54 找不到名为CommandParameter的转换器 I/MvxBind (18314): 132,53 找不到名为CommandParameter的转换器 I/mono-stdout(18314): MvxBind:Warning:132,53 找不到名为CommandParameter的转换器 最近的发布时间是什么时候? - Eugene Smykov
@Stuart 我正在尝试使用相同的 local:MvxBind="Click OnRemoveClick, CommandParameter=.",但在执行命令时也得到了相同的“.”。请问有什么想法吗? - Mohammad Riyaz
抱歉 - 看起来你并没有像这个2013年的问题一样得到“相同”的答案。最好在一个新的问题中完整地解释你的问题。 - Stuart
@Stuart 如果我们想要使用一个对象作为参数而不仅仅是一个字符串呢? - yan yankelevich

2

今天我在进行CommandParameter编码时,需要做一些修正。axml代码应该包含CommandParameter ='yourParameter',它看起来像这样:

<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button1"
    local:MvxBind="Click MyCommand, CommandParameter='foo'" />
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button2"
    local:MvxBind="Click MyCommand, CommandParameter='bar'" />

即使您想捕获一个整数,仍然需要将其放在单引号中,如下所示:CommandParameter='1234'

在C#代码中,最重要的是从构造函数中删除MvxCommand。这应该被视为属性。

public class MyViewModel : MvxViewModel
{
    public MyViewModel() { }

    public MvxCommand<string> MyCommand
    {
        get
        {
            return new MvxCommand<string>(param => 
            {
                if (param == "foo")
                {
                    // do something
                }
                else if (param == "bar")
                {
                    // do something else
                }
            });
        }
    }
}

这是使用MvvmCross6完成的。它应该可以在之前的版本中正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接