在MVVMCross中显示NULL的值

cas*_*las 0 c# data-binding xamarin.android mvvmcross xamarin

我有以下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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我看来:

local:MvxBind="Text Age,Converter=Nullable;"
Run Code Online (Sandbox Code Playgroud)

Sve*_*übe 5

选项1:FallbackValue

你可以用FallbackValue它.

local:MvxBind="Text Age, Converter=Nullable, FallbackValue='0';"
Run Code Online (Sandbox Code Playgroud)

关于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;
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

选项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;
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

选项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;
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

像这样绑定:

local:MvxBind="Text Age, Converter=Nullable, ConverterParameter='0';"
Run Code Online (Sandbox Code Playgroud)

但是,你应该给转换器一个更有意义的名称,如NullableWithFallbackValaueConverter或任何.

边注

MvxValueConverter<TFrom, TTo>尽可能使用.所以,你不必投内ConvertConvertBack.对于这个特殊的转换器,它没有多大意义.但万一你不知道.

旁注#2

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