Xamarin - 从base64字符串显示图像

时间:2016-05-06 19:43:10

标签: c# wpf xaml xamarin xamarin.ios

我对Xamarin和XAML的新手很新,这是我迄今为止在Android和Android使用的便携式项目中所做的工作。 iPhone(仅使用Android):

Item.cs(从JSON加载)

    [JsonProperty("image")]
    private string ImageBase64 { get; set; }

    [JsonIgnore]
    private Xamarin.Forms.Image _image = null;

    [JsonIgnore]
    public Xamarin.Forms.Image Image
    {
        get
        {
            if (_image == null)
            {
                _image = new Xamarin.Forms.Image()
                {
                    Source = Xamarin.Forms.ImageSource.FromStream(() => new MemoryStream(Convert.FromBase64String(ImageBase64))),
                    BackgroundColor = Color.White,
                    WidthRequest = 64,
                    HeightRequest = 64,
                };
                OnPropertyChanged("Image");
            }
            return _image;
        }
        private set
        { _image = value; }
    }

ItemsView.xaml:

<StackLayout VerticalOptions="FillAndExpand" Padding="5,20,5,0" >
  <Label Text="Items" VerticalOptions="Center" Font="35" HorizontalOptions="Center" />
  <ListView x:Name="list" ItemsSource="{Binding Items}">
    <ListView.ItemTemplate>
      <DataTemplate>
        <ImageCell
                        Text="{Binding ItemName}"
                        Detail="{Binding Infos, StringFormat='{0}'}"
          Image.Source="{Binding Path=Image}">
        </ImageCell>
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
</StackLayout>

我正确地显示了我的标签,但图像并非如此。 有人可以解释一下我做错了吗?

1 个答案:

答案 0 :(得分:12)

Image属性的类型应为ImageSource,而不是Image,因为您显然想要绑定ImageCell的ImageSource属性。除此之外,在属性getter中调用OnPropertyChanged永远不会起作用,因为在绑定(或任何其他使用者)之前必须触发{em}事件才能获得更改的属性值

而不是PropertyChanged,正确的绑定必须是

Image.Source="{Binding ...}

属性应该像这样声明:

<ImageCell ... ImageSource="{Binding Path=Image}" />

如果确实需要延迟创建private string imageBase64; public string ImageBase64 { get { return imageBase64; } set { imageBase64 = value; OnPropertyChanged("ImageBase64"); Image = Xamarin.Forms.ImageSource.FromStream( () => new MemoryStream(Convert.FromBase64String(imageBase64))); } } private Xamarin.Forms.ImageSource image; public Xamarin.Forms.ImageSource Image { get { return image; } set { image = value; OnPropertyChanged("Image"); } } 属性值,您可以将其设为只读,并在Image中进行相应的OnPropertyChanged调用} setter:

ImageBase64