MVVMCross - 将Enum作为ConverterParameter传递

时间:2014-08-22 10:49:43

标签: mvvmcross

我想在Android视图中将特定的枚举值作为ConverterParameter传递。

我正在使用MvvmCross'MvxBind:

local:MvxBind="Visibility Person.Status, 
Converter=EqualityToVisibility, ConverterParameter=PersonState.State1"

然而,传递给Converter的Convert方法的值是字符串“PersonState.State1”,而我想要枚举值。如何告诉MVVMCross传入枚举。 XAML标记具有x:static扩展,但我看不到Android布局的等效项

由于

2 个答案:

答案 0 :(得分:0)

这不能使用标准值转换器和绑定语法来完成。正如@Cheesebaron在评论中指出的那样,这与CommandParameter案例类似 - 请参阅MVVCross: Pass an enum value as a CommandParameter for Android

为了达到你需要的效果,我认为最简单的方法是修改你的值转换器来获取和解析一个字符串。

另一种方法可能是实现第二个值转换器 - ParsePersonStateValueConverter - 它只需要一个字符串输入并返回解析后的enum值。然后,您可以使用绑定表达式中的等值转换器将其嵌套:

 local:MvxBind="Visibility EqualityToVisibility(Person.Status, ParsePersonState('State1'))"

答案 1 :(得分:0)

但是我们当然可以将枚举作为转换器参数传递。它所需要的只是一个辅助类,一个XAML标记扩展:

[ContentProperty("Value")]
public sealed class MyEnumExtension : IMarkupExtension {
  public MyEnum Value { get; set; }

  public MyEnumExtension() {
    Value = MyEnum.Default; // change to whatever is your default
  }

  public MyEnum.Extension(MyEnum value) {
    Value = value;
  }

  public object ProvideValue(IServiceProvider serviceProvider) => Value;
  object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider) => ProvideValue(serviceProvider);
};

,在XAML中,只需将其与定义它的适当名称空间一起使用即可。

< ... {Binding ... ConverterParameter={local:MyEnum AnyMyEnumValue}}" ... />

使用扩展名的确切名称命名扩展类,并附加后缀Extension很重要。

解析和转换将在编译时完成,该值使用严格的类型存储,并且可以直接在转换器中使用,而无需解析,只需转换为枚举即可:

(MyEnum)parameter