MVVMCross:将枚举值作为Android的CommandParameter传递

时间:2014-08-05 22:47:29

标签: android binding enums mvvmcross commandparameter

我想将枚举值作为CommandParameter传递。 我的枚举定义为:

public enum MyEnum
{
   One,
   Two
}

在我的轴上我有:

local:MvxBind="Click MyCommand, CommandParameter=MyEnum.One"
...
local:MvxBind="Click MyCommand, CommandParameter=MyEnum.Two"

和MyCommand在我的ViewModel中定义为

public IMvxCommand MyCommand
{
  get { return new MvxCommand<MyEnum>(myfunction); }
}

private void myfunction(MyEnum p_enumParam)
{
  switch (p_enumParam)
  {
      case MyEnum.One:
          doSomething1();
          break;
      case MyEnum.Two:
          doSomething2();
          break;
  }
}

当我运行它时,我收到错误&#34; System.InvalidCastException:无法从源类型转换为目标类型。&#34;

显然,因为它无法将MyEnum.OneMyEnum.Two强制转换为MyEnum类型。那么我如何才能说服MyEnum.OneMyEnum.Two属于MyEnum类型?

谢谢, 巴氏

1 个答案:

答案 0 :(得分:2)

MvvmCross无法从绑定语句中猜出枚举的类型 - 因此它无法执行此绑定。

最简单的方法可能就是使用string来解决此问题 - 然后您需要使用字符串中的Enum.Parse到ViewModel中的枚举。


另一种方法是你也可以实现一个解析ValueConverter的枚举,它只解析字符串 - 例如你可以以https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding/ValueConverters/MvxCommandParameterValueConverter.cs为基础 - 你可以在此添加Enum.Parse来创建:

public class MyEnumCommandValueConverter
    : MvxValueConverter<ICommand, ICommand>
{
    protected override ICommand Convert(ICommand value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return new MvxWrappingCommand(value, Enum.Parse(typeof(MyEnum), parameter.ToString()));
    }
}

然后您可以使用嵌套进行绑定 - 使用类似:

local:MvxBind="Click MyEnumCommand(MyCommand, 'Two')"