android - MVV交叉: Pass an enum value as a CommandParameter for Android

标签 android binding enums mvvmcross 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.Two 转换为 MyEnum 类型。那么我怎样才能说服它 MyEnum.OneMyEnum.TwoMyEnum 类型呢?

谢谢, 巴氏

最佳答案

MvvmCross 无法从绑定(bind)语句中猜测枚举类型 - 因此它无法执行此绑定(bind)。

最简单的方法可能是使用 string 来解决这个问题 - 然后您需要使用 Enum.Parse 从字符串到枚举中的枚举 View 模型。


另一种方法是,您还可以实现一个枚举解析 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()));
    }
}

然后您可以使用嵌套进行绑定(bind) - 使用如下内容:

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

关于android - MVV交叉: Pass an enum value as a CommandParameter for Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25149547/

相关文章:

android - 如何在 cwac 的 MergeAdapter 中添加 ExpandableListadApter

java - 如何在尝试执行注册 Activity 时修复 Android 中的 "com.android.Volley.TimeoutError"

Cocoa - 如何在 InterfaceBuilder 中绑定(bind) NSView 的宽度?

c# - 绑定(bind)到用户控件中的 Observable 集合并从中获取通知

java - Android SQLite java.lang.IllegalArgumentException : column '_id' does not exist

c# - WPF 绑定(bind)依赖属性

c# - 我应该如何命名一个枚举来描述一个字段是隐藏的、可选的还是必需的?

linq - 在 Entity Framework Where 子句中使用枚举

c# - 如何获得复杂的枚举值字符串表示

java - 不同语言的 Android 文字转语音