关于c#:MVVMCross MvxBind,将多个值绑定到一个属性

MVVMCross MvxBind, binding multiple values to one property

如何使用布尔值组合来设置MvxBind按钮上的enabled属性?

例如:

使用一个布尔值,可以通过以下方式实现绑定:

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

但是我如何使用多个布尔值来实现这一点呢?

我尝试过的不起作用的事情:

  • 在axml中使用or语句。local:MvxBind="Enabled (IHaveDoneThis | IHaveDoneThat)"
  • 在我的ViewModel中使用额外属性。由于属性未被"设置",因此未在视图中更新,因此无法执行此操作。

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

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