You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在MvvmCross中能否结合多个属性实现可见性绑定?

如何通过两个Boolean属性的组合设置控件可见性(MvvmCross)

当然可以实现!不过直接在绑定表达式里写local:MvxBind="Visibility Visibility(BoolProperty1 && BoolProperty2)"可能没法直接工作,因为MvvmCross默认的Visibility值转换器只接受单个布尔参数,而且绑定语法本身不支持这种直接的逻辑运算。这里有几种靠谱的方案供你选择:

方案1:在ViewModel中新增计算属性(最推荐)

把两个布尔属性的组合逻辑封装在ViewModel的计算属性里,这是最符合MVVM设计规范的做法,也让逻辑更清晰易维护。

在你的ViewModel中添加:

// 假设已有BoolProperty1和BoolProperty2两个属性,且实现了INotifyPropertyChanged
public bool ShouldShowControl => BoolProperty1 && BoolProperty2;

注意:如果BoolProperty1或BoolProperty2的值发生变化时,需要触发ShouldShowControl的属性变更通知。你可以在这两个属性的setter中调用RaisePropertyChanged(nameof(ShouldShowControl)),比如:

private bool _boolProperty1;
public bool BoolProperty1
{
    get => _boolProperty1;
    set
    {
        _boolProperty1 = value;
        RaisePropertyChanged();
        RaisePropertyChanged(nameof(ShouldShowControl));
    }
}

// BoolProperty2同理

然后在绑定中直接使用这个计算属性:

local:MvxBind="Visibility Visibility(ShouldShowControl)"

方案2:自定义多参数值转换器

如果你不想在ViewModel中新增属性,可以自定义一个支持多参数的Visibility转换器,直接在绑定中传入两个布尔属性。

步骤1:创建自定义转换器

using MvvmCross.Converters;
using System.Globalization;
// 根据你的平台替换Visibility类型,比如Android用ViewStates,iOS用UIViewVisibility
using Windows.UI.Xaml;

public class AndVisibilityConverter : MvxValueConverter<bool[], Visibility>
{
    protected override Visibility Convert(bool[] values, Type targetType, object parameter, CultureInfo culture)
    {
        // 确保传入了至少两个布尔值,且全部为true时才显示控件
        if (values == null || values.Length < 2 || values.Any(b => !b))
        {
            return Visibility.Collapsed;
        }
        return Visibility.Visible;
    }
}

步骤2:注册转换器

在你的Setup类中注册这个转换器:

protected override void InitializeLastChance()
{
    base.InitializeLastChance();
    Mvx.IoCProvider.RegisterSingleton<AndVisibilityConverter>();
}

步骤3:在绑定中使用

local:MvxBind="Visibility AndVisibility(BoolProperty1, BoolProperty2)"

方案3:使用绑定表达式的Lambda语法(部分场景支持)

如果你的MvvmCross版本支持绑定表达式中的Lambda(比如配合Fody.PropertyChanged或某些增强绑定库),可以尝试这样写:

local:MvxBind="Visibility Visibility(() => BoolProperty1 && BoolProperty2)"

不过这种方式的兼容性不如前两种,而且可能需要额外配置,所以优先推荐方案1或方案2。

内容的提问来源于stack exchange,提问作者ronak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:03:38