MVVMCross MvxBind, binding multiple values to one property
如何使用布尔值组合来设置
例如:
使用一个布尔值,可以通过以下方式实现绑定:
1 2 3 | <Button android:text="Next" local:MvxBind="Enabled IHaveDoneEverything"/> |
但是我如何使用多个布尔值来实现这一点呢?
我尝试过的不起作用的事情:
- 在axml中使用or语句。
local:MvxBind="Enabled (IHaveDoneThis | IHaveDoneThat)" 在我的ViewModel中使用额外属性。由于属性未被"设置",因此未在视图中更新,因此无法执行此操作。
1
2
3
4public bool IHaveDoneAtleastSomething
{
get { return (IHaveDoneThis | IHaveDoneThat); }
}使用自定义值转换器。
1local:MvxBind="Enabled [IHaveDoneThis , IHaveDoneThat], Converter=MultipleBooleansToOneBooleanUsingORValueConverter"/>
用代替实际解决了这个问题。
1 | local:MvxBind="Enabled (IHaveDoneThis || IHaveDoneThat)" |
为了便于将来参考,为了使额外的ViewModel属性正常工作,您必须确保当IHavedOnEthis或IHavedOnEthat更改时,ViewModel调用额外属性的raisePropertiesChanged方法,否则绑定将不会触发。
我通常做的是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | private bool _internalIHaveDoneThis; public bool IHaveDoneThis { get{return _internalIHaveDoneThis;} set { if(_internalIHaveDoneThis != value) { _internalIHaveDoneThis = value; RaisePropertyChanged(() => IHaveDoneThis); RaisePropertyChanged(() => IHaveDoneAtleastSomething); } } } private bool _internalIHaveDoneThat; public bool IHaveDoneThat { get{return _internalIHaveDoneThat;} set { if(_internalIHaveDoneThat != value) { _internalIHaveDoneThat = value; RaisePropertyChanged(() => IHaveDoneThat); RaisePropertyChanged(() => IHaveDoneAtleastSomething); } } } public bool IHaveDoneAtleastSomething { get { return (IHaveDoneThis | IHaveDoneThat); } } |