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源设置为AlbumSource,因为我认为实现AlbumSourceGet-only 属性:

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

恕我直言,属性访问器应该总是几乎立即返回。长时间运行的操作不应在属性访问器内部执行,因为这可能会对性能产生重大影响,因为广泛认为访问器基本上是变量读取操作(即属性可以在循环中被大量访问,而不是为后续访问缓存等) )。

我会做这样的事情:

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,则需要 return 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 回答