我在视图模型中有一个枚举属性,如果属性值是特定值,我想让标签可见
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类型的处理方式有关。
答案 0 :(得分:2)
在西藏绑定插件中,声明如下:
If(State==1, 'Visible', 'Gone'
由于iOS JIT限制而未编译 - 而是评估它们。
可悲的是,如果不使用动态代码,对==
等运营商的评估就变得非常困难......
因此,西藏==
运营商尝试做的是将左右两侧缩减为以下三种类型中的一种:long
,double
或{{1} } - 它使用:
object
确定这些类型然后调用其中一种方法,每种方法都使用左手类型的 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
对于 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
。
你可以使用枚举上的值转换器来做到这一点 - 例如string
或ToStringValueConverter
,您可以使用它们:
ToLongValueConverter
或:
If(ToLong(State)==1, 'Visible', 'Gone'
显然,向前看,这个区域也可以在Mvx内部得到改善 - 除了 If(ToString(State)=='Running', 'Visible', 'Gone'
和Swiss
之外的任何谎言