在 MVVMCross 中显示 NULL 值

Show a value in case of NULL in MVVMCross

我有以下NullableConverterclass。但是,当我 运行 我的应用程序时,它在 TextView 中没有显示任何内容,如果值为空,我怎么能显示 0 呢?是否可以在 axml 中完成?

public class NullableValueConverter : MvxValueConverter
{
    public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }

    public override object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || string.IsNullOrEmpty(value.ToString()))
        {
            return null;
        }

        return value;
    }
}

在我看来:

local:MvxBind="Text Age,Converter=Nullable;"

选项 1:回退值

您可以为此使用 FallbackValue

local:MvxBind="Text Age, Converter=Nullable, FallbackValue='0';"

关于 Spec 如果没有值(null 是一个值),它确实会回退。因此,您必须将转换器更改为:

public class NullableValueConverter : MvxValueConverter
{
    public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (string.IsNullOrEmpty(value?.ToString()))
        {
            throw new ArgumentNullException(nameof(value));
        }
        return value;
    }
    // ...
}

选项 2:Convert

中的简单 return

或者你可以简单地 return 0 而不是抛出异常然后不使用 FallbackValue

public class NullableValueConverter : MvxValueConverter
{
    public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (string.IsNullOrEmpty(value?.ToString()))
        {
            return "0";
        }
        return value;
    }
    // ...
}

但是这个转换器不再那么通用了。

选项 3:ConverterParameter

第三个选项是通过 ConverterParameter

传递回退
public class NullableValueConverter : MvxValueConverter
{
    public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (string.IsNullOrEmpty(value?.ToString()))
        {
            return parameter;
        }
        return value;
    }
    // ...
}

并像这样绑定:

local:MvxBind="Text Age, Converter=Nullable, ConverterParameter='0';"

但是你应该给转换器起一个更有意义的名字,比如 NullableWithFallbackValaueConverter 之类的。

旁注

尽可能使用MvxValueConverter<TFrom, TTo>。所以你不必在 ConvertConvertBack 内部进行转换。对于这个特定的转换器,它没有多大意义。但以防万一你不知道。

旁注 #2

我可以想象这种方法会受到一些人的批评,因为这种方法的缺点是,显示的值取决于您视图中的数据绑定。而这个你必须写多次(例如在 iOS 和 Android 中)。如果实际值为 null,则设置回退值更受 ViewModel 的关注。