I have a custom class (to simplify stuff, I have stripped down the codes):
public class AlbumItem
{
   public StorageFile AlbumThumbnail { get; set;}
}
When I bind this to a 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>
The Image's source is set to AlbumSource, as I have thought to implement AlbumSource as a Get-only property:
public class AlbumItem
{
   public StorageFile AlbumThumbnail { get; set;}
   public BitmapImage AlbumSource
   {
       get
       {
          BitmapImage bmp = new BitmapImage();
          bmp.SetSource(await AlbumThumbnail.OpenReadAsync());
          return bmp;
       }
   }
}
As expected I can't use the await keyword in the accessor method, at the same time I cannot declare a property stub as an async method.
Can somebody point me in the correct direction? I may be trying a Converter later. Thanks!
IMHO property accessors should always return almost immediately. Long running operations should not execute inside a property accessor as this can have significant perfromance impacts because of the widely held assumption that an accessor is basically a variable read operation (i.e. properties can be accessed a lot, in loops, not cached for subsequent access etc).
I'd do something like this:
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;
    }
}
If you use await, the return type will have to be Task<BitmapImage>. If you want to be able to bind to your XAML, you need to return BitmapImage, and therefore can't use await. Use Task.Result instead:
public BitmapImage AlbumSource
{
    get
    {
       BitmapImage bmp = new BitmapImage();
       bmp.SetSource(AlbumThumbnail.OpenReadAsync().GetResults());
       return bmp;
    }
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With