MVVMCross MvxBind,将多个值绑定到一个属性

时间:2014-02-26 09:51:18

标签: c# android mvvmcross valueconverter mvxbind

如何使用布尔值的组合,在enabled按钮上设置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"/>

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

为了将来参考,为了使额外的ViewModel属性正常工作,您必须确保ViewModel在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); } 
}