C# 使用Xamarin.Forms中的转换器替换图像

C# 使用Xamarin.Forms中的转换器替换图像,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我正在尝试使用Xamarin.Forms中的Converters根据数据下载动态更改Image源代码 从服务器获取数据总共有三种状态 1) 成功下载数据时成功 2) 未下载数据且存在错误时出错 3) 当进程空闲时 对于以上所有情况,我使用不同的图标 这是我的XAML代码 <Image Source="{Binding CustomerState, Converter={StaticResource SyncConverter}}" HorizontalOptions="CenterA

我正在尝试使用
Xamarin.Forms中的
Converters
根据数据下载动态更改
Image
源代码

从服务器获取数据总共有三种状态

1) 成功下载数据时成功 2) 未下载数据且存在错误时出错 3) 当进程空闲时

对于以上所有情况,我使用不同的图标

这是我的XAML代码

 <Image Source="{Binding CustomerState,  Converter={StaticResource SyncConverter}}"  HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" Grid.Column="0" HeightRequest="20" Margin="8,12,8,12" />
在上述代码中,如果
CustomeState
为空,则显示
ic_idle
图标,如果
cuswtomerst
为真,则显示成功,否则显示错误

我的视图模型代码

private bool? isCustomerState;

public bool? CustomerState
        {
            get { return isCustomerState; }
            set
            {
                isCustomerState = value;
                OnPropertyChanged("CustomerState");


            }
        }
但不知何故,xamarin在
get{return isCustomerState;}
上抛出了错误,错误是

System.NullReferenceException:对象引用未设置为实例 指一个物体

您可以在使用“值”之前尝试验证它。差不多

public class SyncConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {

          if(value != null){
            bool? syncState = value as bool?;

            if (syncState != null) { 
                if (syncState.Value) return "ic_success";
                else return "ic_error";
            }
           }
          return "ic_idle";
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
您可以在使用“值”之前尝试验证它。差不多

public class SyncConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {

          if(value != null){
            bool? syncState = value as bool?;

            if (syncState != null) { 
                if (syncState.Value) return "ic_success";
                else return "ic_error";
            }
           }
          return "ic_idle";
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
更新:正如Alessandro在评论中提到的-在这种情况下,转换器提供的实例返回类型可能不是实际问题。应处理从字符串到ImageSource的转换

由于要绑定到的源属性的类型为-因此转换器还应返回类型为的实例

您可以在此处找到更多详细信息:

更新:正如Alessandro在评论中提到的-在这种情况下,转换器提供的实例返回类型可能不是实际问题。应处理从字符串到ImageSource的转换

由于要绑定到的源属性的类型为-因此转换器还应返回类型为的实例

您可以在此处找到更多详细信息:

如果我设置了
private bool,仍然会收到相同的错误?isCustomerState=false
那么我不会抛出,但在这种情况下,它显示的是ic_错误而不是ic_状态我需要为此使用DataTrigger吗?或者转换器需要足够的时间
IsVisible=“{Binding MasterState}
字段当MasterState变为null时IsVisible不知道该做什么,what sayWhy”IsVisible"? 您应该绑定源代码。那么IsVisible的MasterState不应为null。如果它可以为null,那么如果我设置了
private bool,那么使用一个IValueConverter将可为null的值转换为True,否则仍然会得到相同的错误?isCustomerState=false
那么我不会抛出,但在这种情况下,它显示的是ic_错误而不是ic_状态我需要为此使用DataTrigger吗?或者转换器需要足够的时间
IsVisible=“{Binding MasterState}
字段当MasterState变为null时IsVisible不知道该做什么,what sayWhy”IsVisible"? 您应该绑定源代码。那么IsVisible的MasterState不应为null。如果可以为null,则使用IValueConverter将可为null的值转换为false的True。它还可以返回stringYes-您是对的。binding属性上的TypeConverter应该负责从字符串到ImageSource的转换。它还可以返回stringYes-你说得对。binding属性上的TypeConverter应该负责从字符串到ImageSource的转换。这不起作用。您误解了什么是
targetType
。这也不是在C#中检测
null
的方法。这不起作用。您误解了什么是
targetType
。这也不是在C#中检测
null
的方法。
public class SyncConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {

      if(value != null){
        bool? syncState = value as bool?;

        if (syncState != null) { 
            if (syncState.Value) return ConvertToImageSource("ic_success");
            else return ConvertToImageSource("ic_error");
        }
       }
      return ConvertToImageSource("ic_idle");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    private ImageSource ConvertToImageSource(string fileName)
    {
         return Device.OnPlatform(
              iOS: ImageSource.FromFile($"Images/{fileName}"),
              Android:  ImageSource.FromFile(fileName),
              WinPhone: ImageSource.FromFile($"Images/{fileName}"));
    }
}
  public class SyncConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
        {
            if (targetType != typeof(bool))
                return ConvertToImageSource("ic_idle"); 

            return (bool)value? ConvertToImageSource("ic_success"): ConvertToImageSource("ic_error");
        }

        public object ConvertBack(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
        {
            return (bool)value;
        }
    }