web-dev-qa-db-ja.com

Xamarin-base64文字列の画像を表示する

私はXamarinとXAMLの新機能です。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>

ラベルは正しく表示されますが、画像は表示されません。誰かが私が間違っていることを私に説明できますか?

10
Arnaud F.

ImageCellのImageプロパティをバインドしたいように見えるので、ImageSourceプロパティのタイプはImageではなくImageSourceにする必要があります。その上、OnPropertyChangedイベントを発生させる必要があるため、プロパティゲッターでPropertyChangedを呼び出しても機能しませんbeforeバインディング(または他のコンシューマ)は変更を取得できますプロパティ値。

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プロパティ値の遅延作成が必要な場合は、それを読み取り専用にして、対応するOnPropertyChangedImageBase64で呼び出すことができます。セッター:

private string imageBase64
public string ImageBase64
{
    get { return imageBase64; }
    set
    {
        imageBase64 = value;
        OnPropertyChanged("ImageBase64");
        OnPropertyChanged("Image");
    } 
}

private Xamarin.Forms.ImageSource image;
public Xamarin.Forms.ImageSource Image
{
    get
    {
        if (image == null)
        {
            image = Xamarin.Forms.ImageSource.FromStream(
                () => new MemoryStream(Convert.FromBase64String(ImageBase64)));
        }
        return image;
    }
}
16
Clemens