2

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

public enum MyEnum
{
   One,
   Two
}

在我的 axml 中,我有:

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;
  }
}

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

显然,因为它不能强制转换MyEnum.OneMyEnum.TwoMyEnum 类型。那么我怎样才能说服它MyEnum.One并且MyEnum.TwoMyEnum类型呢?

谢谢,爸爸

4

1 回答 1

3

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

最简单的方法可能是使用strings 来解决这个问题 - 然后您需要使用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')"
于 2014-08-06T15:41:45.963 回答