2014-02-26 37 views
3

如何使用布尔值组合来设置MvxBind按钮上的enabled属性?MVVMCross MvxBind,将多个值绑定到一个属性

例如:

使用一个布尔值,则与实现绑定:

<Button 
     android:text="Next" 
     local:MvxBind="Enabled IHaveDoneEverything"/> 

但我怎么实现这个使用多个布尔值?

事情我已经试过了没有工作:

  • 在axml使用OR语句。 local:MvxBind="Enabled (IHaveDoneThis | IHaveDoneThat)"
  • 在我的ViewModel中使用额外的属性。这不起作用,因为该属性未被设置,因此在视图中未被更新。

    public bool IHaveDoneAtleastSomething 
    { 
        get { return (IHaveDoneThis | IHaveDoneThat); } 
    } 
    
  • 使用自定义值转换器。

    local:MvxBind="Enabled [IHaveDoneThis , IHaveDoneThat], Converter=MultipleBooleansToOneBooleanUsingORValueConverter"/>
+1

您是否尝试过的逻辑,而不是按位OR?在https://github.com/MvvmCross中查看http://stackoverflow.com/questions/3154132/what-is-the-difference-between-logical-and-conditional-and-or-in-c和解析器中的答案/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross.Binding/Parse/Binding/Tibet/MvxTibetBindingParser.cs#L120 - 另外,我认为你应该可以使用'或(Expr1,Expr2)' – Stuart

回答

5

使用||而不是|实际解决了这个问题。

local:MvxBind="Enabled (IHaveDoneThis || IHaveDoneThat)" 
1

以供将来参考,以获得额外的视图模型性质的工作,你就必须确保该视图模型呼吁额外的属性,只要IHaveDoneThis或IHaveDoneThat以其他方式改变的结合不会触发RaisePropertyChanged方法。

我最常做的是一样的东西:

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); } 
} 
+1

为了将来的参考,有一些项目试图帮助你做到这一点automagically - 特别是http://slodge.blogspot.co.uk/2013/07/intercepting-raisepropertychanged.html和http://slodge.blogspot.co。 uk/2013/06/intercepting-raisepropertychanged.html以及Fody - http://slodge.blogspot.co.uk/2013/07/awesome-clean-viewmodels-via-fody.html - 但是对于一次性案例全部这些都是过度杀伤:) – Stuart

+0

谢谢你的Stuart-Fody看起来很棒。已经通过T4模板生成RaisePropertyChanged内容,但看起来效果更好! – isaacmcn