使用MvxCommand与CommandParameter绑定

时间:2013-06-21 11:49:38

标签: mvvm binding command xamarin.android mvvmcross

我正在尝试使用fire 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
          }
      });
    }
}

但是当我检查 param 变量 null

我做错了什么?

2 个答案:

答案 0 :(得分:10)

您的代码在我的源代码树头上为我工作。

但这个功能只有两周了。

我的猜测是,这个功能要么没有进入你正在使用的版本,要么就是它的错误。

您可以检查此绑定的调试跟踪吗?那里有信息吗?

  • 如果跟踪显示CommandParameter是未知符号,那么我的猜测是您需要自己构建最新的源代码 - 或者等待新的版本。
  • 如果跟踪显示其他内容,那么您可以在安装过程中修补问题。

我知道我们确实解决了一件事是价值转换器问题,其中基于Cirrious.MvvmCross.Binding.dll的{​​{1}}并非只是通过覆盖ValueConverter来注册Setup.ValueConverterAssembliesValueConverter

需要

答案 1 :(得分:1)

我今天正在进行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中完成的。它应该可以与以前的版本配合使用。