如何检查 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表单创建空解决方案

将 JSON 子对象转换为 Xamarin 表单中的表

使用 Prism Xamarin 表单创建动态 TabbedPage

Xamarin 表单:如何复制条目值?