2012-11-29 8 views
5

プロパティアクセサ[Windowsストアアプリ/メトロアプリ]でAwaitableメソッドの呼び出し:は(ものを簡素化するために、私はコードを剥ぎ取られている)私は、カスタムクラスを持っている

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> 

私はGetのみのプロパティとしてAlbumSourceを実装するために考えられてきたようにImageのソースは、AlbumSourceに設定されている:

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を試しているかもしれません。ありがとう!

答えて

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

ありがとう!私は考えを持っていたが、Flavienの方法は私の即時の必要性を解決した。私はあなたのアプローチを探り、私がそれを立ち上げて、それに従うことができるかどうかを見ていきます。 –

+2

+1これはより正確な答えです。 'async'プロパティが存在しないという技術的な理由はありません。 「非同期プロパティ」はプロパティのコンセプトに反するため、設計上の決定でした。 –

+0

これまでのところ、私はこのメソッドを使ってプロパティを実装していますが、それは私のUIを詰まらせるものではありません!本当にありがとう! –

2

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

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

dkackmanの答えは、感謝の両方を探求するために私に別の次元を与えたが、この方法は、私の問題を解決します!私は 'Task.Result'を' Task.GetResults() 'に変更しなければなりませんでした。そして、' SetSource'の構文エラーのために悪いです(代わりに 'SetSource()')。 –

関連する問題