在 MVVMCross 中显示 NULL 值
Show a value in case of NULL in MVVMCross
我有以下NullableConverter
class。但是,当我 运行 我的应用程序时,它在 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>
。所以你不必在 Convert
和 ConvertBack
内部进行转换。对于这个特定的转换器,它没有多大意义。但以防万一你不知道。
旁注 #2
我可以想象这种方法会受到一些人的批评,因为这种方法的缺点是,显示的值取决于您视图中的数据绑定。而这个你必须写多次(例如在 iOS 和 Android 中)。如果实际值为 null
,则设置回退值更受 ViewModel 的关注。
我有以下NullableConverter
class。但是,当我 运行 我的应用程序时,它在 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>
。所以你不必在 Convert
和 ConvertBack
内部进行转换。对于这个特定的转换器,它没有多大意义。但以防万一你不知道。
旁注 #2
我可以想象这种方法会受到一些人的批评,因为这种方法的缺点是,显示的值取决于您视图中的数据绑定。而这个你必须写多次(例如在 iOS 和 Android 中)。如果实际值为 null
,则设置回退值更受 ViewModel 的关注。