12

我正在尝试将 fire MvxCommand 与 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

我做错了什么?

4

2 回答 2

10

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

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

我的猜测是,此功能要么没有进入您正在使用的版本,要么存在错误。

你能检查你的调试跟踪这个绑定吗?那里有任何信息吗?

  • 如果跟踪表明这CommandParameter是一个未知符号,那么我的猜测是您需要自己构建最新的源代码 - 或者等待新版本。
  • 如果跟踪表明其他内容,那么您可以在设置期间修补问题。

我知道我们确实修复的一件事是一个值转换器问题,其中Cirrious.MvvmCross.Binding.dllbasedValueConverter不仅仅是通过覆盖Setup.ValueConverterAssemblies来注册ValueConverter所需的CommandParameter

于 2013-06-21T13:16:46.750 回答
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 中完成的。它应该适用于以前的版本。

于 2018-12-30T20:27:13.007 回答