【问题标题】:How to check object null value in xamarin forms data trigger?如何检查 xamarin 表单数据触发器中的对象空值?
【发布时间】: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

标签: xaml xamarin binding xamarin.forms datatrigger


【解决方案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 您是看到特定错误还是它没有按预期工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2021-06-08
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多