在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
相关产品推荐
相关产品推荐

