5

我正在尝试为虚拟化列表创建一个 Win8 Metro 参考应用程序。在做一些(非常稀疏的)阅读时,我发现支持这一点的推荐方法是通过ISupportIncrementalLoading界面。

我的参考应用程序出现问题,该LoadMoreItemsAsync方法被调用一次,但不再被调用,即使我的HasmoreItems属性被硬编码为返回 True。

下面的代码应该做的是加载 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 运算符,因此它将同步运行。我有一个类似的问题。当我收到一些库文件夹时,数据虚拟化对我有用,但是当我尝试加载自定义项目的集合时它只被触发一次。

我使用了一种解决方法,虽然不是很优雅,但它确实有效。像这样修改您的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 回答