2016-04-22 20 views
0

我有以下NullableConverter類。但是,當我運行我的應用程序時,它不顯示TextView中的任何內容,如果值爲空,我怎麼能顯示0?是否有可能在axml中做到這一點?在MVVMCross中NULL時顯示值

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;" 

回答

5

選項1:FallbackValue

您可以使用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:在將簡單迴歸

或者你可以簡單地返回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更關注的問題。