5

仮想化リスト用の Win8 Metro リファレンス アプリを作成しようとしています。いくつかの (非常にまばらな) 読み取りを行っているときに、これをサポートする推奨される方法はISupportIncrementalLoadingインターフェイスを使用することであることがわかりました。

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

以下のコードがすべきことは、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;
    }


}

}

4

2 に答える 2

2

問題は、メソッドLoadDataAsync(uint count)に await 演算子がないため、同期的に実行されることです。同様の問題がありました。いくつかのライブラリ フォルダーを受信して​​いる間、データ仮想化は機能していましたが、カスタム アイテムのコレクションを読み込もうとしたときに 1 回だけトリガーされました。

あまりエレガントではありませんが、うまくいきました。LoadDataAsyncメソッドを次のように変更します。

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};
}
于 2012-05-26T10:01:36.397 に答える
0

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

余談ですが、LoadMoreItemsAsync のコードを次のように単純化できます。

public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
{
    return LoadDataAsync(count).AsAsyncOperation();
}
于 2012-05-10T04:57:34.207 に答える