枚举支持MvvmCross数据绑定

时间:2014-01-28 21:55:51

标签: mvvmcross

我在视图模型中有一个枚举属性,如果属性值是特定值,我想让标签可见

States state;
public States State
{
    get { return this.state; }
    set
    {
        if (this.state != value)
        {
            this.state = value;
            this.RaisePropertyChanged("State");
        }
    }
}

public enum States
{
    Stopped,
    Runnning
}

这是我在UI中尝试的内容:

local:MvxBind="Visibility If(State==1, 'Visible', 'Gone')"

但它不起作用。日志中不会显示错误。

我可以制作转换器,但我想知道是否可以在没有它的情况下进行转换。

如果我修改State属性使用int而不是Enum,它可以正常工作。 我想这与当前Enum类型的处理方式有关。

1 个答案:

答案 0 :(得分:2)

在西藏绑定插件中,声明如下:

 If(State==1, 'Visible', 'Gone'

由于iOS JIT限制而未编译 - 而是评估它们。

可悲的是,如果不使用动态代码,对==等运营商的评估就变得非常困难......

因此,西藏==运营商尝试做的是将左右两侧缩减为以下三种类型中的一种:longdouble或{{1} } - 它使用:

object

来自https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding/Combiners/MvxPairwiseValueCombiner.cs#L36

确定这些类型然后调用其中一种方法,每种方法都使用左手类型的 private Type GetLookupTypeFor(object value) { if (value == null) return null; if (value is long) return typeof(long); if (value is double) return typeof (double); return typeof (object); } 运算符,如果两种类型都是==,则使用.Equals

object

来自https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding/Combiners/VeryExperimental/MvxEqualToValueCombiner.cs

对于 protected override bool CombineDoubleAndDouble(double input1, double input2, out object value) { value = input1 == input2; return true; } protected override bool CombineDoubleAndLong(double input1, long input2, out object value) { value = input1 == input2; return true; } // ... etc enum的情况,我认为左手将被标识为State==1而右手将被标识为object - 所以这些将永远不会平等,因为:

long

使用当前代码,我认为让测试工作的唯一方法是将左侧和右侧都放到 protected override bool CombineObjectAndLong(object input1, long input2, out object value) { value = false; return true; } long

你可以使用枚举上的值转换器来做到这一点 - 例如stringToStringValueConverter,您可以使用它们:

ToLongValueConverter

或:

 If(ToLong(State)==1, 'Visible', 'Gone'

显然,向前看,这个区域也可以在Mvx内部得到改善 - 除了 If(ToString(State)=='Running', 'Visible', 'Gone' Swiss之外的任何谎言