2017-12-26 13 views
0

MVVMのxamarin.Formsアプリケーションに問題があります。 ListViewがあり、ItemTemplateに画像を表示したい。ここでListView Xamarin.formsがImageResourceを使用してItemSourceから画像を動的に読み込みます。

[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:画像= "CLR私はImageRessourceクラスを作成していることを行うために、 -namespace:CoPro.Assets "

このように、私のリストビューは、すべての"シリーズ "アイテムについて同じ画像を表示します。 各Itemには、画像のパスを表す文字列プロパティがあります。 各アイテムの画像を表示するにはどうしたらいいですか?

ご協力いただきありがとうございます。

+0

なぜ。 FileImageSourceを直接使用しないでください。 –

答えて

0

解決策が見つかりました。

<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; 
     } 
    } 

このコードに「$」CoPro.Assets」私のイメージファイルであるパスであなたの助けのための

おかげ

関連する問題