2012-05-10 23 views
5

仮想化リスト用のWin8 Metro参照アプリケーションを作成しようとしています。いくつかの(非常にまばらな)読書をする際に、これをサポートするための推奨される方法はISupportIncrementalLoadingインターフェイスを使っていることがわかりました。ISupportIncrementalLoadingは一度だけ起動します

私のHasmoreItemsプロパティがTrueを返すようにコードされているにもかかわらず、LoadMoreItemsAsyncメソッドが一度呼び出されたが、再び呼び出されないリファレンスアプリケーションに問題があります。

以下のコードは40個のアイテムを読み込み、その後に一度に「x」番号をロードすることです。最初の40個のアイテムをロードした後、42個をロードするように促され、再度ロードすることは決してありません。

ここに私のコードの関連部分があります:

XAML

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}"> 
    <ListView ItemsSource="{Binding Items}" Width="800" HorizontalAlignment="Left" Margin="12"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Title}" Foreground="White"/> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

</Grid> 

のViewModelとサポートクラス:それは感じているとき

public class MainViewModel : ViewModelBase 
{ 

    public MyIncrementalCollection Items { get; set; } 

    public MainViewModel() 
    { 

     Items = new MyIncrementalCollection(); 



     for (int i = 0; i < 40; i++) 
     { 
      Items.Add(new MyData {Title = string.Format("Item: {0}", i)}); 
     } 
    } 
} 

public class MyData 
{ 
    public string Title { get; set; } 
} 

public class MyIncrementalCollection : ObservableCollection<MyData>, ISupportIncrementalLoading 
{ 
    public bool HasMoreItems 
    { 
     get 
     { 
      return true; 
     } 
    } 

    public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count) 
    { 
     return 
      (IAsyncOperation<LoadMoreItemsResult>) 
      AsyncInfo.Run((System.Threading.CancellationToken ct) => LoadDataAsync(count)); 
    } 

    private async Task<LoadMoreItemsResult> LoadDataAsync(uint count) 
    { 

     for (int i = 0; i < count; i++) 
     { 
      this.Add(new MyData { Title = string.Format("Item: {0}, {1}", i, System.DateTime.Now) }); 
     } 

     var ret = new LoadMoreItemsResult {Count = count}; 

     return ret; 
    } 


} 

}

答えて

2

にLoadMoreItemsAsyncでコードを簡素化することができたような問題は、あなたの方法LoadDataAsync(UINT数)はのawait演算子を欠くと原因、それは同期的に実行することにしていることです。 私も同様の問題がありました。私はいくつかのライブラリフォルダを受け取っていたが、データ仮想化は私のために働いていたが、カスタムアイテムのコレクションをロードしようとしたときに一度だけトリガされた。

私は回避策を使用しましたが、それほどエレガントではありませんでしたが、効果はありました。簡略化のため

private async Task<LoadMoreItemsResult> LoadDataAsync(uint count) 
{ 
    Task task = Task.Delay(1); 
    await task; 

    for (int i = 0; i < count; i++) 
    { 
    Add(new MyData { Title = string.Format("Item: {0}, {1}", i, System.DateTime.Now) }); 
    } 

    return new LoadMoreItemsResult {Count = count}; 
} 
+0

さて、シャック。それは動作します。彼らがRCでこれを解決するかどうかは不思議です... – Robaticus

0

UIはHasMoreItemsを呼び出しますそれが必要です。現在表示されている領域を埋めるのに十分なアイテムがある場合は、それ以上のアイテムはチェックされません。リストの最後に向かってスクロールし始めると、それ以上のアイテムがあるかどうかがチェックされます(また、LoadMoreItemsAsyncが呼び出されている場合)。

さておき、あなたが

public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count) 
{ 
    return LoadDataAsync(count).AsAsyncOperation(); 
} 
+0

ありがとう: は、このようなあなたのLoadDataAsync方法を変更します。ここで問題となるのは、私がスクロールすると、ロードは一度しか呼び出されないということです。私は追加アイテムの最初の読み込みの後、リストの一番下にそれを作ることができ、それは決して再び発生しません。 – Robaticus

+0

よろしくお願いします.xamlはあなたの全体像ですか?他の問題には、ListViewをScrollViewer内に持っていれば、データビューアのトリガを取得できません(ListView内部のScrollViewerを使用することに依存するため)。 –

+0

これは全体で、 ''タグを除きます。 ListViewに読み込みが完了したことを通知するために、非同期の読み込みアクションに固有の処理を行う必要がありますか?私はLoadMoreItemsResultの復帰が本当に必要なものであると仮定しました。 – Robaticus

関連する問題