我想将枚举值作为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.One
和MyEnum.Two
强制转换为MyEnum类型。那么我如何才能说服MyEnum.One
和MyEnum.Two
属于MyEnum
类型?
谢谢, 巴氏
答案 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')"