在 MVVMCross 中显示为 NULL 时显示一个值

本文关键字:显示 一个 MVVMCross NULL | 更新日期: 2024-11-10 04:00:00

我有以下NullableConverter类。但是当我运行我的应用程序时,它没有在TextView显示任何内容,如果值为 null,我怎么能显示 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;"

在 MVVMCross 中显示为 NULL 时显示一个值

选项 1:回退值

您可以使用FallbackValue

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

关于规范,如果没有值(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:转换中的简单返回

或者,您可以简单地返回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传递回退

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 更关心的问题。