将图像绑定到URL Xamarin Forms XAML

时间:2016-11-13 22:11:11

标签: image xaml xamarin data-binding xamarin.forms

我无法使用Xamarin Forms将图像绑定到UriImageSource。

我已经实现了FlowListView,它提供了一个类似于网格的文本列表,但是与每个产品相关联的图像都没有出现。

有没有其他人知道如何解决这个问题?

XAML:

<flv:FlowListView 
    Grid.Row="1" 
    x:Name="flvListView" 
    SeparatorVisibility="None" 
    HasUnevenRows="true" 
    FlowColumnMinWidth="110">
    <flv:FlowListView.FlowColumnTemplate>
        <DataTemplate>
            <Grid Padding="3">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Image HeightRequest="100" >
                    <Image.Source>
                        <UriImageSource Uri="{Binding ProductImage}" />
                    </Image.Source>
                </Image>
                <Label 
                    x:Name="Label" 
                    HorizontalOptions="Fill" 
                    HorizontalTextAlignment="Center" 
                    VerticalOptions="End" 
                    BackgroundColor="Silver"
                    Opacity="0.5" Text="{Binding ProductName}"/>
            </Grid>
        </DataTemplate>
    </flv:FlowListView.FlowColumnTemplate>
</flv:FlowListView>

查看型号:

public class vmProduct
{
    public vmProduct() { }
    /* removed other properties, constructors etc */
    public UriImageSource ProductImage { get; set; }
    public string ProductName { get; set; }
}

初始化vmProduct时

this.Products.Add(new vmProduct
{
    ProductName = "Test",
    ProductImage = new UriImageSource
    {
        Uri = new Uri("https://upload.wikimedia.org/wikipedia/en/5/5f/Original_Doge_meme.jpg")
    }
});

(在上面的示例中,&#34;测试&#34;将出现,但图像不会出现)

2 个答案:

答案 0 :(得分:6)

由于您将UriImageSource绑定到Uri,因此您的ViewModel属性必须是Uri。

public UriImageSource ProductImage { get; set; }更改为public Uri ProductImage { get; set; }

答案 1 :(得分:0)

有相同的问题,并且我不知道这是否已更改,但是我发现您可以按以下方式将海峡绑定到图像源:

<Image HeightRequest="200" Source="{Binding ProductImage}"/>

然后在后面的代码上,您可以使用var,并让C#执行正确的强制转换:

   public ImageSource ProductImage {
        get {
            var source =  new Uri("http://myurl.com/one.jpg");
            return source;
        }
    }

我喜欢的是,如果您想让代码与资源中的图像一起使用,我们只需像这样更改源代码行即可:

    public ImageSource ProductImage {
        get {
            var source = "resource_image.png"
            return source;
        }
    }

要记住的一件事是,它们似乎是在MacOS的Xamarin中通过TLS加载图像的问题,因此我建议坚持使用http或在Windows上构建。