如何检查 xamarin 表单数据触发器中的对象空值?
Posted
技术标签:
【中文标题】如何检查 xamarin 表单数据触发器中的对象空值?【英文标题】:How to check object null value in xamarin forms data trigger? 【发布时间】:2017-12-03 01:25:50 【问题描述】:我正在尝试检查 Xamarin Forms XAML DataTrigger 中的绑定对象值是否为空,但我无法让它工作。我尝试了以下方法:
<StackLayout IsVisible="True">
<StackLayout.Triggers>
<DataTrigger TargetType="StackLayout"
Binding="Binding MyObject"
Value="x:Null">
<Setter Property="IsVisible" Value="False"></Setter>
</DataTrigger>
</StackLayout.Triggers>
...
</StackLayout>
有人知道怎么做吗?我仅在 android 上对此进行了测试。
编辑:我已向 xamarin bugzilla https://bugzilla.xamarin.com/show_bug.cgi?id=57863提交了错误报告
【问题讨论】:
您是否遇到任何错误?其他绑定是否正常工作,即它肯定是在尝试检查是否存在问题? 我没有看到任何错误,是的,其他绑定工作正常。 我刚刚对其进行了测试,也遇到了同样的问题...这可能是 Xamarin 错误。一种解决方法是使用实现 IValueConverter 的转换器? 感谢您的测试。转换器可能是一个很好的解决方法。我已向 xamarin bugzilla 提交了一个错误:bugzilla.xamarin.com/show_bug.cgi?id=57863 【参考方案1】:您可以使用转换器并将其设置为适合我的工作。让我们试试下面的代码。
转换器代码
public class NullValueBoolConverter: IValueConverter, IMarkupExtension
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
if (value is string)
if (string.IsNullOrEmpty(value as string))
return false;
else
return true;
else
if (value == null)
return false;
else
return true;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
return value;
public object ProvideValue(IServiceProvider serviceProvider)
return this;
并与 IsVisible 属性绑定,如下所示:
<StackLayout IsVisible="Binding Registerclosure.Notes, Converter=Helpers:NullValueBoolConverter">
</StackLayout>
不要忘记标题中的下一行
xmlns:Helpers="clr-namespace:MyNameSpace"
【讨论】:
如果 binding 为 null 则不会调用转换器,这是由 xamarin 设计制作的【参考方案2】:这是 Xmarin Forms here 的一个错误
【讨论】:
是的,我提交了。我现在已经编辑了问题以包含错误报告链接。【参考方案3】:只是优化之前解决方案中的代码
public class NullValueBoolConverter : IValueConverter, IMarkupExtension
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
if (value is string)
string val = value as string;
return !string.IsNullOrEmpty(val);
return !(value == null);
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
return value;
public object ProvideValue(IServiceProvider serviceProvider)
return this;
【讨论】:
【参考方案4】:我知道这是一个旧线程,但这里是解决方案:
顺便说一句,您不需要在 StackLayout 中使用 Isvisible="True"
,因为默认值为 true。
<StackLayout IsVisible="True">
<StackLayout.Triggers>
<DataTrigger TargetType="StackLayout"
Binding="Binding MyObject, TargetNullValue=''"
Value="">
<Setter Property="IsVisible" Value="False"></Setter>
</DataTrigger>
</StackLayout.Triggers>
...
</StackLayout>
【讨论】:
仅供参考 - 当我尝试在标签上使用 TargetNullValue='' 时,它似乎在 Xamarin Forms 5+ 中中断。 @nixkuroi 您是看到特定错误还是它没有按预期工作?以上是关于如何检查 xamarin 表单数据触发器中的对象空值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 xamarin 表单共享项目中检查 Internet 连接
xamarin 表单中的 datepicker 和 timepicker 多次触发 Focus 和 Unfocus 事件
Visual Studio 2017为xamarin表单创建空解决方案