ListView Xamarin.forms使用ImageResource从ItemSource动态加载图像

时间:2017-12-26 10:13:55

标签: image listview xamarin.forms

我的MVVM中的xamarin.Forms应用程序存在问题。我有一个ListView,我想在ItemTemplate中显示一个图像。为此,我创建了一个ImageRessource类:

[ContentProperty("Source")]
public class ImageResourceExtension : IMarkupExtension
{
    public string Source { get; set; }

    public object ProvideValue(IServiceProvider serviceProvider)
    {
        if (Source == null)
        {
            return null;
        }

        var imageSource = ImageSource.FromResource($"CoPro.Assets.{Source}");

        return imageSource;
    }
}

这是我的ListView的xaml:

 <ListView  ItemsSource="{Binding Series}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="20"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <StackLayout Orientation="Horizontal">
                                    <Image Source="{images:ImageResource image.jpg}"/>
                                </StackLayout>
                                <Label Grid.Column="1" Text="{Binding Name}" Style="{StaticResource UsualLabelTemplate}" />
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

此外,我已经通过此命名空间设置了“图像”:xmlns:images =“clr-namespace:CoPro.Assets”

像这样,我的ListView为每个“系列”项显示相同的图片。 对于每个Item,都有一个带有图像路径的字符串属性。 我该如何展示每件商品的图片?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我刚刚找到了解决方案。我不得不使用Image标签中的Source属性:

<ListView Grid.Row="1" x:Name="MainListView"  ItemsSource="{Binding Series}">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <ViewCell.View>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="60"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>                                           
                                        <Image Source="{Binding ImageUrl, Converter={StaticResource StringToImageSourceConverter}}" 
                                               Aspect="AspectFill"
                                              />
                                        <Label Grid.Column="1" Text="{Binding Name}" Style="{StaticResource UsualLabelTemplate}" />
                                    </Grid>
                                </ViewCell.View>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

解决方案是使用Converter,Source属性包含字符串。这个字符串被发送到我的转换器中的参数,如下所示:

 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            return ImageSource.FromResource($"CoPro.Assets.{value}"); 
        }
        else
        {
            return null;
        }  
    }

在此代码&#34; $&#34; CoPro.Assets&#34;是我的图像文件的路径。

感谢您的帮助