Xamarin绑定为空时按钮默认隐藏及转换器实现方案咨询
Xamarin.Forms中绑定对象为null时的按钮可见性处理方案
嘿,我来帮你搞定这两个Xamarin.Forms里的绑定问题!
一、绑定对象为null时将按钮可见性设为不可见(对应你说的false效果)
先澄清一下:Xamarin.Forms里的Visibility是枚举类型,没有直接的true/false,不可见对应的是Collapsed(完全隐藏,不占布局空间)或者Hidden(隐藏但占空间),通常我们用Collapsed来实现“不可见”的需求。
这里分两种情况处理:
- 如果你的Xamarin.Forms版本是4.0及以上:其实官方已经支持
TargetNullValue了,不用写转换器就能直接实现,代码很简单:
<Button Text="我的按钮" Visibility="{Binding MyBoundObject, TargetNullValue=Collapsed}" />
这样当MyBoundObject为null时,按钮就会自动变成不可见状态。
- 如果你的版本不支持
TargetNullValue,或者更倾向用转换器实现:那我们可以写一个自定义的值转换器:
首先创建转换器类:
using System; using System.Globalization; using Xamarin.Forms; namespace YourAppNamespace.Converters { public class NullToVisibilityConverter : IValueConverter { // 正向转换:绑定对象为null → 不可见;否则可见 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return value != null ? Visibility.Visible : Visibility.Collapsed; } // 反向转换一般用不到,直接抛出异常即可 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException("反向转换未实现"); } } }
然后在XAML页面里引用这个转换器:
首先在页面顶部声明命名空间(替换成你自己的转换器命名空间):
xmlns:converters="clr-namespace:YourAppNamespace.Converters"
接着在页面的资源里注册转换器:
<ContentPage.Resources> <converters:NullToVisibilityConverter x:Key="NullToVisibility" /> </ContentPage.Resources>
最后给按钮绑定Visibility:
<Button Text="我的按钮" Visibility="{Binding MyBoundObject, Converter={StaticResource NullToVisibility}}" />
二、通过转换器实现绑定对象为null时将可见性设为null
这里要注意:Visibility本身是值类型,不能直接为null,但我们可以用可空的Visibility?类型来实现。如果你的需求是当绑定对象为null时,把按钮的Visibility设为null,可以修改转换器的逻辑:
创建转换器类:
using System; using System.Globalization; using Xamarin.Forms; namespace YourAppNamespace.Converters { public class NullToNullableVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { // 绑定对象为null → 返回null(可空Visibility);否则返回Visible return value != null ? Visibility.Visible : (Visibility?)null; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException("反向转换未实现"); } } }
然后同样在XAML里注册并使用这个转换器就可以了。不过一般来说,设置Visibility为null的场景比较少见,大部分情况还是用Collapsed来控制隐藏,你可以根据自己的实际需求选择。
内容的提问来源于stack exchange,提问作者Mason11987
相关产品推荐
相关产品推荐

