5

私はカスタムクラスを持っています(物事を単純化するために、私はコードを取り除きました):

public class AlbumItem
{
   public StorageFile AlbumThumbnail { get; set;}
}

これをListViewにバインドすると、次のようになります。

<ListView.ItemTemplate>
            <DataTemplate>
                <Grid Height="100" Background="#FFabe372">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="80" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <Image Source="{Binding AlbumSource}" Margin="10" Stretch="Uniform"></Image>
                    <TextBlock Margin="20 5" Grid.Column="1" Style="{StaticResource  AlbumListViewItemStyle}" Text="{Binding AlbumDisplayText}"></TextBlock>
                </Grid>

            </DataTemplate>
</ListView.ItemTemplate>

のみのプロパティとして実装することを考えたので、Imageのソースはに設定されます。AlbumSourceAlbumSourceGet

public class AlbumItem
{
   public StorageFile AlbumThumbnail { get; set;}

   public BitmapImage AlbumSource
   {
       get
       {
          BitmapImage bmp = new BitmapImage();
          bmp.SetSource(await AlbumThumbnail.OpenReadAsync());
          return bmp;
       }
   }
}

予想どおりawait、アクセサメソッドでキーワードを使用することはできません。同時に、プロパティスタブをasyncメソッドとして宣言することはできません。

誰かが私を正しい方向に向けることができますか?Converter後でやってみるかもしれません。ありがとう!

4

2 に答える 2

7

IMHO プロパティ アクセサーは、常にほとんどすぐに返される必要があります。長時間実行される操作は、プロパティ アクセサー内で実行しないでください。これは、アクセサーが基本的に変数の読み取り操作であるという広く信じられている前提のためです (つまり、プロパティはループで何度もアクセスでき、後続のアクセスのためにキャッシュされないなど)。 )。

私はこのようなことをします:

private async Task SetAlbumSourceAsync()
{
    bmp = new BitmapImage();
    var source = await AlbumThumbnail.OpenReadAsync();
    bmp.SetSource(source);
    RaisePropertyChanged("AlbumSource");
}

BitmapImage bmp;
public BitmapImage AlbumSource
{
    get
    {
        if (bmp == null) // might need a better sync mechanism to prevent reentrancy but you get the idea
            SetAlbumSourceAsync();

        return bmp;
    }
}
于 2012-11-29T15:05:15.717 に答える
2

を使用する場合await、戻り値の型は である必要がありますTask<BitmapImage>。XAML にバインドできるようにするには、 を返す必要があるためBitmapImage、 を使用できませんawait。代わりに Task.Result を使用します。

public BitmapImage AlbumSource
{
    get
    {
       BitmapImage bmp = new BitmapImage();
       bmp.SetSource(AlbumThumbnail.OpenReadAsync().GetResults());
       return bmp;
    }
}
于 2012-11-29T15:03:11.903 に答える